Python编程语言的代码规范
PEP 8规范
PEP是Python Enhancement Proposal的缩写,翻译过来教"Python增强规范"。
缩进规范
Python的缩进其实可以写成很多种,Tab、双空格、四空格、空格和Tab混合等。而PEP 8规范要求,选择四个空格的缩进,不要使用Tab,更不要使用Tab和空格混着用。
第二个注意:每行最大长度限制在79个字符
空行规范
Python中的空行对Python解释器的执行没有影响,但对阅读体验有很深刻的影响。
PEP 8规定,全局的类和函数的上方需要空两个空行,而类的函数之间需要空一个空行。
函数内部也可以使用空行,和英文的段落一样,用来区分不同的代码块,但最多空一行。
另外,Python本身允许把多行合并一行,使用分号隔开,但这是PEP 8不推荐的做法。
至于代码的尾部,每个代码文件的最后一行为空行,并且只有这一个空行。
空格规范
函数的参数列表中,调用函数的参数列表中会出现逗号,逗号后要跟一个空格。
冒号经常被用来初始化字典,冒号后边也要跟着一个空格。
另外,Python中可以使用#进行单独注释,要在#后注释前加一个空格。
对于操作符,例 +, -, *, / … 在两边都要保留空格。不过与此对应,括号内的两端并不需要空格。
换行规范
示例
def solve1(this_is_the_first_parameter, this_is_the_second_parameter, this_is_the_third_parameter,
this_is_the_forth_parameter, this_is_the_fifth_parameter, this_is_the_sixth_parameter):
return (this_is_the_first_parameter + this_is_the_second_parameter + this_is_the_third_parameter +
this_is_the_forth_parameter + this_is_the_fifth_parameter + this_is_the_sixth_parameter)
def solve2(this_is_the_first_parameter, this_is_the_second_parameter, this_is_the_third_parameter,
this_is_the_forth_parameter, this_is_the_fifth_parameter, this_is_the_sixth_parameter):
return this_is_the_first_parameter + this_is_the_second_parameter + this_is_the_third_parameter + \
this_is_the_forth_parameter + this_is_the_fifth_parameter + this_is_the_sixth_parameter
(top_secret_func(param1=12345678, param2=12345678, param3=12345678, param4=12345678, param5=12345678).check()
.launch_nuclear_missile().wait())
top_secret_func(param1=12345678, param2=12345678, param3=12345678, param4=12345678, param5=12345678).check() \
.launch_nuclear_missile().wait()
可以通过两种方法优化代码
- 第一种
通过括号来将国长的运算进行封装,此时虽然跨行,但是仍处于一个逻辑引用之下。函数调用也可以使用类似的方式,只需要用一对括号将其包裹起来。
- 第二种
则是通过换行符来实现。
class Model(network.Network):
def fit(self,
x=None,
y=None,
batch_size=None,
epochs=1,
verbose=1,
callbacks=None,
validation_split=0.,
validation_data=None,
shuffle=True,
class_weight=None,
sample_weight=None,
initial_epoch=0,
steps_per_epoch=None,
validation_steps=None,
validation_freq=1,
max_queue_size=10,
workers=1,
use_multiprocessing=False,
**kwargs):
# Legacy support
if 'nb_epoch' in kwargs:
logging.warning(
'The `nb_epoch` argument in `fit` has been renamed `epochs`.')
epochs = kwargs.pop('nb_epoch')
if kwargs:
raise TypeError('Unrecognized keyword arguments: ' + str(kwargs))
self._assert_compile_was_called()
func = self._select_training_loop(x)
return func.fit(
self,
x=x,
y=y,
batch_size=batch_size,
epochs=epochs,
verbose=verbose,
callbacks=callbacks,
validation_split=validation_split,
validation_data=validation_data,
shuffle=shuffle,
class_weight=class_weight,
sample_weight=sample_weight,
initial_epoch=initial_epoch,
steps_per_epoch=steps_per_epoch,
validation_steps=validation_steps,
validation_freq=validation_freq,
max_queue_size=max_queue_size,
workers=workers,
use_multiprocessing=use_multiprocessing)
文档规范
- import尽量放在开头
- 不要使用import一次导入多个模块
- 如果采用from module import func这样的语句,确保func在本文中不会出现命名冲突。可以通过from module import func as new_func来进行重命名,从而避免冲突。
注释规范
对于大的逻辑块,可以在最开始相同的缩进处以#开始写注释。
至于行注释,可以在一行后面跟着两个空格,然后以#开头加入注释。
# This is an example to demonstrate how to comment.
# Please note this function must be used carefully.
def solve(x):
if x == 1: # This is only one exception.
return False
return True
命名规范
-
变量命名拒绝使用a b c d 这样毫无意义的单字符,应该使用能够代表其意思的变量名。
-
一般来说,变量使用小写,通过下划线串联起来,例:data_format。
-
如果是类的私有变量,前面需要增加两个下划线。
-
对于常量,最好的做法是全部用大写,并通过下划线连接,例:WAIT_TIME
-
对于函数名,同样使用小写的方式,通过下划线连接起来。例:launch_nuclear_missile()
-
对于类名,则应该首字母大写,然后合并起来,例:class SpatialDropout2D()
代码分解技巧
编程中核心思想是,不写重复代码。重复代码大概率可以通过使用条件、循环、构造函数和类来解决。
示例
if i_am_rich:
money = 100
send(money)
else:
money = 10
send(money)
send语句出现了两次,所以完全可以合并一下
if i_am_rich:
money = 100
else:
money = 10
send(money)
示例
def send(money):
if is_server_dead:
LOG('server dead')
return
else:
if is_server_timed_out:
LOG('server timed out')
return
else:
result = get_result_from_server()
if result == MONEY_IS_NOT_ENOUGH:
LOG('you do not have enough money')
return
else:
if result == TRANSACTION_SUCCEED:
LOG('OK')
return
else:
LOG('something wrong')
return
优化后
def send(money):
if is_server_dead:
LOG('server dead')
return
if is_server_timed_out:
LOG('server timed out')
return
result = get_result_from_server()
if result == MONET_IS_NOT_ENOUGH:
LOG('you do not have enough money')
return
if result == TRANSACTION_SUCCEED:
LOG('OK')
return
LOG('something wrong')
示例
- 拆分类
class Person:
def __init__(self, name, sex, age, job_title, job_description, company_name):
self.name = name
self.sex = sex
self.age = age
self.job_title = job_title
self.job_description = description
self.company_name = company_name
job在其中出现了很多次,而且它们表达的是一个意义实体,这种情况下,可以考虑将这部分分解出来,作为单独的类
class Person:
def __init__(self, name, sex, age, job_title, job_description, company_name):
self.name = name
self.sex = sex
self.age = age
self.job = Job(job_title, job_description, company_name)
class Job:
def __init__(self, job_title, job_description, company_name):
self.job_title = job_title
self.job_description = description
self.company_name = company_name
本文地址:https://blog.csdn.net/m0_45198298/article/details/107062700