wenhaha的目录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/7a5b6e1fec759b8c7d29684ea302fdbf.gif)
对于一个合格的python程序猿,养成良好的编码习惯并不困难。但是由于学习了多种编程语言,很可能在初学python的时候,造成你的代码不够专业。这里总结了一些让你的python代码变得优雅的方法,希望可以帮到您QAQ
1. 使用 in / not in 来判断值是否在序列中
初学者代码:(C、java常用循环遍历)
favorite = '云缨'
heroes = ['云缨', '后羿', '小鲁班']
for hero in heroes:
if hero == favorite:
print('美好的一天,从巡街开始')
# 或者
name = 'wenhaha'
if name.find('a') != -1:
print('a 在里面')
优秀代码:
if favorite in heroes:
print('美好的一天,从巡街开始')
name = 'wenhaha'
if 'a' in name:
print('a 在里面')
2. 判断“真”“假”的方式
if x:
if not x:
python中常见的、布尔值为“假”的数据有:
0, 空字符串,空序列,None(比如从利用模型从数据库读取对象但是没有读到)
a = 0
b = ''
c = []
if a == 0 and b == '' and len(c)==0:
print('全是假的uuu')
优秀代码:
if a or b or c:
print('总有一个真的东西')
3. 超级nice的输入方式
现在要接收用户输入的一串数字,听到这里,有些朋友可能已经马上想到 for、while,但是在python中,我们可以这样做:
# 输入 2 5 3 8 0
nums = list(map(int,input().split()))
print(nums)
相比C或者Java是不是简洁多了呢?
解释:input().split()能帮我们接收输入并默认按空格分隔开,得到一个列表,但是列表元素还是字符串
所以我们需要用map()来将这个列表的每一个元素,都映射为int(整数)类型,这时候我们得到的是一个迭代器,我们再将它转换为一个列表,就得到这个数字构成的列表了。
4. 随机数模块,建议使用randrange(a,b)代替randint(a,b)
程序的世界里一般都是左闭右开,比如切片的时候,包含左边索引而不包含右边索引。然而randint(a,b)这个东西有点反人类,他是闭区间的,左右都可以取。(讲真,第一次见到这个函数我还以为它是左闭右开)
randrange(a,b)则是左闭右开,符合我们的习惯。
5. 熟练使用 列表推导式
学了随机数,那你可以生成长度为5的随机数列表吗?有的同学开始操练起了代码:
import random
my_list = []
for i in range(5):
num = random.randrange(1,100)
my_list.append(num)
print(my_list)
然而,使用列表推导式,能够更优雅的写出这个列表:
import random
my_list = [random.randrange(1,100) for i in range(5)]
print(my_list)
这里只写了一个一重循环的列表推导式(也最常用),如果要一个多维的列表呢?如果还要满足一定条件呢?
6. 字符串与列表的互相转换
字符串转列表 – 别犹豫,直接转
最开始我是这样写的:
chars = 'abcdefg'
c_list = list()
for c in chars:
c_list.append(c)
print(c_list)
直到我看到了这样的代码:
c_list = list('abcdefg')
妈耶,这也太简单了
列表转字符串 – 善用join()
heroes = ['云缨', '后羿', '小鲁班']
all_hs = '-'.join(heroes)
print(all_hs)
注意列表数据类型不是字符串的时候,需要转换
7. 遍历列表且需要使用索引的时候 – enumerate()
当你需要根据列表的索引解决问题的时候,很久以前我一直是这样写的:
import random
my_list = [random.randrange(1,100) for i in range(6)]
print(my_list)
new_list = []
for i in range(len(my_list)):
if i % 2:
new_list.append(my_list[i])
print(new_list)
输出结果:
有可能你会这样写:
import random
my_list = [random.randrange(1,100) for i in range(6)]
print(my_list)
i = 0
new_list = []
for num in my_list:
if i % 2:
new_list.append(num)
i += 1
print(new_list)
引入enumerate()
import random
my_list = [random.randrange(1,100) for i in range(6)]
print(my_list)
new_list = []
for i,num in enumerate(my_list):
if i % 2:
new_list.append(num)
print(new_list)
输出结果:
8. 当你需要同时处理两个大小相同的列表 – zip()
遍历处理
初学者写法:-- .ljust(7)是字符串左对齐占位7个字符。相对的还有.rjust()
names = ['jack', 'tom', 'wenhaha']
scores = [90, 88, 85]
for i in range(len(names)):
print(f'{names[i]} 得分:{scores[i]}')
优秀写法:
names = ['jack', 'tom', 'wenhaha']
scores = [90, 88, 85]
for name,score in zip(names,scores):
print(f'{name.ljust(7)} 得分:{score}')
生成字典
用了字典推导式但是操作冗余了:
names = ['jack', 'tom', 'wenhaha']
scores = [90, 88, 85]
students = {name:score for name,score in zip(names,scores)}
print(students)
直接使用zip()
students = dict(zip(names,scores))
9. 交换两个数的值
C和java一般都会使用到中间变量,或者多个表达式,在python可以一行完成。
a, b = b, a
你可以理解为元组的解包,但是实际原理不是解包。可以参考这一篇文章
10. 学会使用lambda表达式
匿名函数,如果一个函数可以优化到用一个return语句就能写完,那就可以考虑lambda表达式。
Question1:discount = [0.2, 0.8, 0.6, 10]
该列表里面有一个异常值:10,我们需要将它处理为0.5
discount = list(map(lambda x: x if x<=1 else 0.5,discount))
Question2:names = ['wenhaha', 'Jack', 'tom']
我们要将该列表里面的单词变为首字符大写
names = list(map(lambda x: x.capitalize(),names))
11. 命名规范 - 必不可少
使用PyCharm写代码时,有时候你的命名被它“标黄”了,可能就是命名不规范,有时候也是单词拼错了。
类名:单词首字母大写
class Student:
全局变量名(类变量,在java中相当于static变量):大写字母,单词之间用_分割
import os
USER = os.environ.get('DB_USER')
普通变量:小写字母,单词之间用_分割
num_list = [5, 2, 0]
普通函数:和普通变量一样:
def get_url():
pass
12. 注意python中的负数整除(2021-7-21更新)
print(-5//2)
在python中结果为 -3,而在C和java中的-5/2的结果是-2
结语
如果大家有任何问题或者想和我交流,请评论或者私信我噢 !
求个赞!我只会心疼giegie!