编程语言
首页 > 编程语言> > 改善python——用pythonic的方法思考

改善python——用pythonic的方法思考

作者:互联网

1. 知道你使用的python的版本

2. 遵循PEP8的风格

Python Enhancement Proposal #8

规则例子
space空格
命名
表达式和语句

3. 知道 bytes、str和unicode之间的差别

字符串的表达
版本表达方法
python2unicode 和 str
python3bytes 和 str
区分
确保类型返回一致
# 始终返回str
def to_str(bytes_or_str):
    return  bytes_or_str.decode('utf-8') if isinstance(bytes_or_str,bytes) else bytes_or_str

# 始终返回bytes
def to_bytes(bytes_or_str):
    return  bytes_or_str.encode('utf-8') if isinstance(bytes_or_str,str) else bytes_or_str

4. 写辅助函数而不是复杂函数表达式

可读性

在python中很容易写一个表达式完成功能。例如解析URL

from urllib.parse import parse_qs
my_values = parse_qs('red=5&blue=0&green=’,
										keep_blank_values=True)

print(repr(my_values))
>>>
{‘red’: [‘5’], ‘green’: [”], ‘blue’: [‘0’]}

目标:获得qs中第一个数字,没有则返回0

red = my_values.get(‘red’, [”])
red = int(red[0]) if red[0] else 0
def get_first_int(values, key, default=0):
    found = values.get(key, [”])
    if found[0]:
    	found = int(found[0])
    else:
    	found = default
    return found

5. 知道如何对序列进行切片

6. 避免在单个切片中使用start、end和stride

7. 使用列表推导式而不是map和filter

# 求 a 中 偶阶方
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 1. 简单的方法 列表推倒式子
even_square = [x**2 for x in a if x%2==0] # [4, 16, 36, 64, 100]

#2. 复杂的map搭配filter方法
alt=map(lambda x: x**2, filter(lambda x: x%2 ==0,a))
# 反转字典
res_dict={value,key for key,value in dict}

8. 避免在列表表达式中使用2个以上的表达式

难以阅读

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
filtered = [[x for x in row if x % 3 == 0]
               for row in matrix if sum(row) >= 10]
print(filtered)
>>>
[[6], [9]]

9. 考虑用于大型推导式的生成器表达式

10. 使用enumerate而不是range

flavor_list = ['vanilla', 'chocolate', 'pecan', 'strawberry']

#遍历列表的range 方法
for i in range(len(flavor_list)):
    flavor = flavor_list[i]
    print(‘%d: %s’ % (i + 1, flavor))

# 简便方法:enumerate
for i, flavor in enumerate(flavor_list):
		print(‘%d: %s’ % (i + 1, flavor))

# 可以指定开始位置
for i, flavor in enumerate(flavor_list,  1):
		print(‘%d: %s’ % (i + 1, flavor))

11. 使用zip并行处理迭代器

names = ['Cecilia', 'Lise', 'Marie']
letters = [len(n) for n in names]

# 获得最长的名字并记下字母数

# 方法1:range
longest_name = None
max_letters = 0
for i in range(len(names)):
	count = letters[i]
    if count > max_letters:
        longest_name = names[i]
        max_letters = count

#方法2:enumerate
for i, name in enumerate(names):
    count = letters[i]
    if count > max_letters:
        longest_name = name
        max_letters = count
 
#方法3:zip
for name, count in zip(names, letters):
    if count > max_letters:
        longest_name = name
        max_letters = count

12.避免在for和while循环之后出现else块

else 会在正常退出时候执行,而在break时候不会执行

# else被执行
for i in range(3):
    print('Loop %d' % i)
else:
    print('Else block!')
>>>
Loop 0
Loop 1
Loop 2
Else block

# else 未被执行
for i in range(3):
	print(‘Loop %d’ % i)
	if i == 1:
		break
else:
     print(‘Else block!’)
>>>
Loop 0
Loop 1

13. 利用try/except/else/finally中的每个块

UNDEFINED = object()
def divide_json(path):
			handle = open(path, ‘r+’) # May raise IOError
			try:
                data = handle.read() # May raise UnicodeDecodeError
                op = json.loads(data) # May raise ValueError
                value = (
                        op[‘numerator’] /
                        op[‘denominator’]) # May raise ZeroDivisionError
			except ZeroDivisionError as e:
						return UNDEFINED
            else:
                op[‘result’] = value
                result = json.dumps(op)
                handle.seek(0)
                handle.write(result) # May raise IOError
                return value
            finally:
            	handle.close() # Always runs 无论如何都会被执行

标签:pythonic,letters,思考,python,bytes,else,str,print,flavor
来源: https://blog.csdn.net/weixin_38371073/article/details/115442168