一、编程习惯
1、注释
Python中有三种形式的注释:行注释、块注释、文档注释
行注释:注释应解释自己做了什么,而不是对代码本身的解释
n = input()
m = input()
t = n / 2 # t是n的一半
# 循环,条件为t*m/n 小于n
while (t * m / (n + 1) < n):
t = 0.5 * m + n / 2 # 重新计算t值
print(t)
块注释:
def FuncName(parameter1,parameter2):
"""
描述函数要做的事情
:param parameter1: 参数一描述(类型、用途等)
:param parameter2: 参数二描述
:return: 返回值描述
"""
注释和代码隔开一定的距离,块注释后面最好多留几行空白再写代码
常见的问题:代码不断更新而注释却没有更新;注释比代码本身还复杂烦琐;将别处的注释和代码一起拷贝过来, 但上下文的变更导致注释与代码不同步;想删除某个函数,但是又怕以后会用到,就直接注释掉。
2.命名
模块名:模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)
# 正确
import decoder
import html_parser
# 不推荐
import Decoder
类名:类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头
class Farm():
pass
class AnimalFarm(Farm):
pass
class _PrivateFarm(Farm):
pass
函数:函数名一律小写,如有多个单词,用下划线隔开
def run():
pass
def run_with_env():
pass
私有函数在函数前加一个下划线_
class Person():
def _private_func():
pass
变量名:变量名尽量小写, 如有多个单词,用下划线隔开
if __name__ == '__main__':
count = 0
school_name = ''
常量名:全部大写,如有多个单词,用下划线隔开
MAX_CLIENT = 100
MAX_CONNECTION = 1000
CONNECTION_TIMEOUT = 600
需要避免
不要中英文混编
不要有a、b、c这种没有意义的命名
不要怕名字长就随便缩写,比如person_info 缩写成pi
不要用大小写区分变量类型,比如a是int类型,A是String类型
不要使用容易引起混淆的变量名
def funA(list, num):
for element in list:
if num == element:
return True
else:
pass
def find_num(searchList, num):
for listValue in searchList:
if num == listValue:
return True
else:
pass
3.函数设计
函数设计的主要目标就是最大化代码重用和最小化代码冗余。精心设计的函数不仅可以提高程序的健壮性,还可以增强可读性、减少维护成本。
函数设计要尽量短小,嵌套层次不宜过深。 所谓短小, 就是尽量避免过长函数, 因为这样不需要上下拉动滚动条就能获得整体感观, 而不是来回翻动屏幕去寻找某个变量或者某条逻辑判断等。 函数中需要用到 if、 elif、 while 、 for 等循环语句的地方,尽量不要嵌套过深,最好能控制在3层以内。不然有时候为了弄清楚哪段代码属于内部嵌套, 哪段属于中间层次的嵌套, 哪段属于更外一层的嵌套所花费的时间比读代码细节所用时间更多。
函数申明应该做到合理、 简单、 易于使用。 除了函数名能够正确反映其大体功能外, 参数的设计也应该简洁明了, 参数个数不宜太多。 参数太多带来的弊端是: 调用者需要花费更多的时间去理解每个参数的意思,测试的时候测试用例编写的难度也会加大
函数参数设计应该考虑向下兼容。
# 第一个版本
def readfile(filename):
print("file read completed")
readfile("test.txt")
# 第二个版本
def readfile(filename, logger):
print("file read completed")
readfile("test.txt", logger)
# 第三个版本
def readfile(filename, logger=logger.info):
print("file read completed")
readfile("test.txt")
应当通过加入默认参数 做到向下兼容。
一个函数只做一件事。这样有利于代码的重用和测试。
4、其他tips
二元运算符两侧应有空格,逗号和分号前不需要,在pycharm里,Ctrl+Alt+l可以格式化代码。
不要在一段代码中说明几件事。 在一组代码表达完一个完整的思路之后, 应该用空白行进行间隔。 如每个函数之间, 导入声明、 变量赋值等。推荐在函数定义或者类定义之间空两行, 在类定义与第一个方法之间, 或者需要进行语义分割的地方空一行。
二、基本语法
1.充分利用Lazy evaluation的特性
延迟计算(Lazy evaluation ),指的是仅仅在需要执行的时候才会计算表达式的值。
常用实践:
条件表达式 if x and y,在x为false的时候就不会再计算y的值了, 对于 if x or y ,在x为true的时候就不会再计算y的值了。这样就可以避免不必要的计算,提带来性能上的提升。
生成器表达式
def fib():
a,b=0,1
while True:
yield a
a,b=b,a+b
from itertools import islice
print(list(islice(fib(),5)))
因为yield关键字的存在,fib()就不是个普通函数了,fib()被调用的时候会创建一个生成器,islice() 适用于在迭代器和生成器上做切片操作,fib()并不会无限执行,而是执行到yield就暂停掉,所以这样即使while True也不会无限循环,使得无限循环的数据结构成为可能。
使用enumerate()获取序列迭代的索引和值
# 方法一
li = ['a', 'b', 'c']
for i in range(len(li)):
print("index:", i, "element:", e)
# 方法二
li = ['a', 'b', 'c']
for i, e in enumerate(li):
print("index:", i, "element:", e)
e = enumerate(li)
e.next() # (0,a)
e.next() # (1,b)
对于字典的循环
for key, value in mydict.iteritems():
print(key, ":", value)
2. ==和is的应用场景
id() 返回的是变量内存
== 的意思就是equal,是判断对象的值是不是相同;
is是对象标识符,它判断两个对象是不是拥有同一块内存。
3.使用else简化代码
循环语句中的else:如果循环自然走到终点,就会执行else语句,如果被break中断,else语句就不会执行
#打印素数
def print_prime(n):
for i in range(2, n):
found = True
for j in range(2, n):
if i % j == 0:
found = False
break
if found:
print(i)
def print_prime1(n):
for i in range(2, n):
for j in range(2, n):
if i % j == 0:
break
else:
print(i)
异常处理中的else:try块没有抛异常时,执行else。
def save(db, obj):
some_error_occurred = False
try:
# save attr1
db.execute(obj.attr1)
# save attr2
db.execute(obj.attr2)
except DBError:
db.rollback()
some_error_occurred = True
if not some_error_occurred:
db.commit()
def save1(db, obj):
try:
# save attr1
db.execute(obj.attr1)
# save attr2
db.execute(obj.attr2)
except DBError:
db.rollback()
else:
db.commit()
4.字符串处理
连接字符串优先使用join而不是‘+’:join
str1, str2, str3 = "hello", "world", "!"
print(str1 + str2 + str3) #不建议
print("".join([str1, str2, str3])) #建议
join申请内存时,会计算所需要的内存,一次性申请,而‘+’每连接一个字符串都要重新申请一次内存,所以join的效率更高。
格式化输出
A = 1.2
print("输出结果是%f" % A)
print(f"输出结果是{A}")
三、推荐资料
静态代码检查工具pylint
《流畅的python》、《编写高质量代码 改善Python程序的91个建议》 https://pan.baidu.com/s/1j_guw_JCH5po9zPBav4G-A
提取码:h9mw
本文地址:https://blog.csdn.net/weixin_43374191/article/details/109031983
希望与广大网友互动??
点此进行留言吧!