Pythonコードをリファクタリングするための10の推奨方法

Pythonコードを読みやすく、高性能にする



画像



Python – , , , -, . – . , , Python . 10 , Python.



1. (. .: ) ,



(. .: ) Python: , . , for, . Python – , : [ for x in _ if ]. , . :



>>> #     
>>> numbers = list(range(5))
>>> print(numbers)
[0, 1, 2, 3, 4]
>>> 
>>> #  :
>>> squares0 = []
>>> for number in numbers:
...     if number%2 == 0:
...         squares0.append(number*number)
... 
>>> print(squares0)
[0, 4, 16]
>>> 
>>> #   Python :
>>> squares1 = [x*x for x in numbers if x%2 == 0]
>>> print(squares1)
[0, 4, 16]




, « » « ». : {_: _ for in _}, – { for in _}. :



>>> #  
>>> {x: x*x for x in range(5)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> 
>>> #  
>>> {x*x for x in range(5)}
{0, 1, 4, 9, 16}




2. F-



– , . — . C, %, format, Python.



Python . «f-», « » – .



>>> #   
>>> usd_to_eur = 0.89
>>> 
>>> #  :
>>> print('1 USD = {rate:.2f} EUR'.format(rate=usd_to_eur))
1 USD = 0.89 EUR
>>> print('1 USD = %.2f EUR' % usd_to_eur)
1 USD = 0.89 EUR
>>> 
>>> #   Python :
>>> print(f'1 USD = {usd_to_eur:.2f} EUR')
1 USD = 0.89 EUR


F-



, f-, , C str.format. f- .



3.



– . . , , , , . , . :



>>> #  :
>>> code = 404
>>> message = "Not Found"
>>> 
>>> #   Python :
>>> code, message = 404, "Not Found"




. , . , , .



>>> #    
>>> http_response = (404, "Not Found")
>>> code, message = http_response
>>> print(f'code: {code}; message: {message}')
code: 404; message: Not Found




4.



, , – . , , , (. .: . catch-all method – -, / , . . , . . , , ). – , , -. , Python , , .



>>> #    
>>> numbers = tuple(range(8))
>>> numbers
(0, 1, 2, 3, 4, 5, 6, 7)
>>> 
>>> #  :
>>> first_number0 = numbers[0]
>>> middle_numbers0 = numbers[1:-1]
>>> last_number0 = numbers[-1]
>>> 
>>> #   Python :
>>> first_number1, *middle_numbers1, last_number1 = numbers
>>> 
>>> #  
>>> print(first_number0 == first_number1)
True
>>> print(middle_numbers0 == middle_numbers1)
False
>>> print(last_number0 == last_number1)
True




, middle_numbers0 middle_numbers1 . , ( ) . , , , :



>>> #     
>>> print(middle_numbers0 == tuple(middle_numbers1))
True


-



5.



, « », «-» :=, , ? , , , , , . , :



>>> #    
>>> def get_account(social_security_number):
...     pass
... 
>>> def withdraw_money(account_number):
...     pass
... 
>>> def found_no_account():
...     pass
... 
>>> #  :
>>> account_number = get_account("123-45-6789")
>>> if account_number:
...     withdraw_money(account_number)
... else:
...     found_no_account()
... 
>>> #   Python :
>>> if account_number := get_account("123-45-6789"):
...     withdraw_money(account_number)
... else:
...     found_no_account()




, , , (. .: withdraw_money), . , , , .



, , – account_number . Swift, (. .: ), . accountNumber, , . , , .



if let accountNumber = getAccount("123-45-6789") {
    withdrawMoney(accountNumber)
} else {
    foundNoAccount()
}




6. enumerate



, - . for. , : for in _. , , , enumerate, . , .



>>> #     
>>> students = ['John', 'Jack', 'Jennifer', 'June']
>>> 
>>> #  :
>>> for i in range(len(students)):
...     student = students[i]
...     print(f"# {i+1}: {student}")
... 
# 1: John
# 2: Jack
# 3: Jennifer
# 4: June
>>>
>>> #   Python :
>>> for i, student in enumerate(students, 1):
...     print(f"# {i}: {student}")
... 
# 1: John
# 2: Jack
# 3: Jennifer
# 4: June


enumerate



7. zip/zip_longest



, , . , , , . , Python zip, , . , zip , . :



>>> #        zip
>>> students = ['John', 'Mike', 'Sam', 'David', 'Danny']
>>> grades = [95, 90, 98, 97]
>>> 
>>> #  :
>>> grade_tracking0 = {}
>>> for i in range(min(len(students), len(grades))):
...     grade_tracking0[students[i]] = grades[i]
... 
>>> print(grade_tracking0)
{'John': 95, 'Mike': 90, 'Sam': 98, 'David': 97}
>>> 
>>> #  :
>>> grade_tracking1 = dict(zip(students, grades))
>>> print(grade_tracking1)
{'John': 95, 'Mike': 90, 'Sam': 98, 'David': 97}
>>>
>>> from itertools import zip_longest
>>> grade_tracking2 = dict(zip_longest(students, grades))
>>> print(grade_tracking2)
{'John': 95, 'Mike': 90, 'Sam': 98, 'David': 97, 'Danny': None}


zip



zip – zip, , , . , zip , - . , zip_longest .



Python dict, dict. , zip , .



>>> for student, grade in zip(students, grades):
...     print(f"{student}: {grade}")
... 
John: 95
Mike: 90
Sam: 98
David: 97


zip



8. (. .: )



zip . , ? , . , chain. :



>>> #     
>>> from itertools import chain
>>> group0 = ['Jack', 'John', 'David']
>>> group1 = ['Ann', 'Bill', 'Cathy']
>>> 
>>> def present_project(student):
...     pass
... 
>>> #  :
>>> for group in [group0, group1]:
...     for student in group:
...         present_project(student)
... 
>>> for student in group0 + group1:
...     present_project(student)
... 
>>> #   Python :
>>> for student in chain(group0, group1):
...     present_project(student)




, Python — . , chain , . , chain : , , , zip map ( map), Python.



9.



- , ? , , . . , , , : var = ___true if else ___false. .



>>> #   
>>> from random import randint
>>> def got_even_number():
...     return randint(1, 10) % 2 == 0
... 
>>> #  : 
>>> if got_even_number():
...     state = "Even"
... else:
...     state = "Odd"
... 
>>> state = "Odd"
>>> if got_even_number():
...     state = "Even"
... 
>>> #   Python :
>>> state = "Even" if got_even_number() else "Odd"




10.



Python, . , . , , .



. , . , . , , , . , – , .



>>> #   
>>> def process_data(row_data):
...     pass
... 
>>> #  :
>>> with open('large_file') as file:
...     read_data = file.read().split("\n")
...     for row_data in read_data:
...         process_data(row_data)
...
>>> #   Python :
>>> with open('large_file') as file:
...     for row_data in file:
...         process_data(row_data)






, Python Python, , – , . , Python . – , Python (. .: ), . Python.



, .




All Articles