判别性别的python代码_青春有你Python——避坑指南与技巧
分享
Python是⼀种跨平台的
Python是⼀种跨平台的计算机程序设计语⾔。 是⼀个⾼层次的结合了解释性、编译性、互动性和⾯向对象的脚本语⾔。最初被设计⽤于编写⾃动化脚本(shell),随着版本的不断更新和语⾔新功能的添加,越多被⽤于独⽴的、⼤型项⽬的开发。
Python是⼀种解释型脚本语⾔,可以应⽤于以下领域:
Web 和 Internet开发
科学计算和统计
⼈⼯智能
桌⾯界⾯开发
软件开发
后端开发
⽹络爬⾍
对于Python新⼿来说,写代码很少考虑代码的效率和简洁性,因此容易造成代码冗长、执⾏慢,这些
都是需要改进的地⽅。本⽂是想通过⼏个案列给新⼿⼀点启发,怎样写python代码更优雅。
配置开发环境
最后如果你需要快速的Demo⼀些东西,⼀个⽐较好⽤的⼯具就是Ipython,或者GUI更加友好的Notebook。如果觉得配置Notebook⿇烦,可以直接安装⼀个Anaconda,这个东西虽然很⼤,但是避免了很多配置问题,对于Windows⽤户更加是福⾳。但是,最好不要⽤他
但是,最好不要⽤他做Python环境管理。如果你需要编码,这⾥直接推荐Pycharm了,社区版本就够⽤。如果你对Vim或者Emac⾮常熟悉,他们也可以配置做Python环境管理
成很好的IDE软件,否则你可能需要话费⼤量时间去配置和学习。(Pycharm⽀持emacs和Vim模式)
强烈建议每⼀项⽬拥有⾃⼰的虚拟环境,⼀个虚拟环境就是⼀套完全独⽴的Python解释器和相应的包,他们都在同⼀个⽬录⾥,通常与项⽬⽂件放在⼀起。
编程开始
1.⽣成器
除⾮你的list⼗分复杂,并且频繁调⽤,否则都建议使⽤⽣成器,因为它⾮常节省内存,举个例⼦:
def powers_of_two(max=20000):
i = 0
powers = []
while 2**i < max:
powers.append[2**i]
i += 1
return powers
对于使⽤次数少、占据⼤量内存、且容易⽣成的数据,可以⽤⽣成器替代列表存储:
from itertools import count, takewhile
def powers_of_two(max=20000):
for index in takewhile(lambda i: 2**i < max, count(start=0)):
yield 2**index
⼆.全局变量的修改
在web项⽬代码中,有很多全局变量,有的是使⽤字符串这样的不可变对象,⽽有的则是使⽤字典这样的可变对象。如果在代码⾥⾯修改了可变的全局变量(如dict,list),就会导致进程中的这个全局变量都修改了。在web服务中,每次request请求都会⽣成⼀个新的线程,这个线程会共⽤进程中的全局变量,如果其中⼀个线程修改了这个全局变量,就会导致所有的线程中使⽤的这个变量都会被修改,最好避免这种情况发⽣,如果⾮要修改这个变量并使⽤的话,就⽤deepcopy把这个全局变量深度拷贝以后再修改,这样就不会影响其他线程的全局变量了。
三.使⽤flag变量⽽不使⽤for…else语句
同样,这样的代码也很常见:
search_list = ['Jone', 'Aric', 'Luise', 'Frank', 'Wey']
found = False
for s in search_list:
if s.startswith('C'):
found = True
# do something when found
print('Found')
break
if not found:
# do something when not found
print('Not found')
其实,⽤ for…else 更优雅:
search_list = ['Jone', 'Aric', 'Luise', 'Frank', 'Wey']
for s in search_list:
if s.startswith('C'):
# do something when found
print('Found')
break
else:
# do something when not found
print('Not found')
四.过度使⽤ tuple unpacking
在 Python 中,允许对 tuple 类型进⾏ unpack 操作,如下所⽰:
# human = ('James', 180, 32)
name,height,age = human
这个特性⽤起来很爽,⽐写 name=human[0] 之类的不知道⾼到哪⾥去了。所以,这⼀特性往往被滥⽤,⼀个 human 在程序的各处通过上⾯的⽅式 unpack。
然⽽如果后来需要在 human 中插⼊⼀个表⽰性别的数据 sex,那么对于所有的这种 unpack 都需要进⾏修改,即使在有些逻辑中并不会使⽤到性别。
# human = ('James', 180, 32)
name,height,age, _ = human
# or
# name, height, age, sex = human
有如下⼏种⽅式解决这⼀问题:
⽼⽼实实写 name=human[0] 这种代码,在需要使⽤性别信息处加上 sex=human[3]
使⽤ dict 来表⽰ human
使⽤ namedtuple
# human = namedtuple('human', ['name', 'height', 'age', 'sex'])
h = human('James', 180, 32, 0)
# then you can use h.name, h.sex and so on everywhere.
五.使⽤上下⽂管理器
新⼿可能会习惯这样进⾏读取⽂件操作:
if ists(data_file_path):
data_file = open(data_file_path,'r')
else:
raise OSERROR
print( ad())
data.close()
这样写会有⼏个明显的问题:
可能出现⽂件存在,但⽂件被占⽤,⽆法读取的情况
可能出现⽂件可以被读取,但操作⽂件对象出现报错的情况
可能出现忘记关闭⽂件的情况
如果使⽤语句,问题就迎刃⽽解了:
with open(data_file_path,'r') as data_file:
print(ad)
这样可以捕获任何打开⽂件或处理数据时的异常情况,并且在任务处理完后⾃动关闭⽂件。
python初学者可能不太了解上下⽂管理器的神奇之处,它真的能带来巨⼤的便利。
六.class.name 判断类型
为了实现某特定功能,我新写了⼀个 class B(A),在 B 中重写了 A 的若⼲函数。整个实现很简单,但是就是有⼀部分 A 的功能⽆法⽣
name == ‘A’。
效。最后追查到的原因,就是在⼀些逻辑代码中,硬性的判断了entity.class
class.name
除⾮你就是想限定死继承层级中的当前类型(也就是,屏蔽未来可能会出现的⼦类),否则,不要使⽤ class class.name name,⽽改⽤ isinstance 这个内建函数。毕竟,Python 把这两个变量的名字都刻意带上那么多下划线,本来就是不太想让你⽤嘛。
七.使⽤⾼级数据结构
举个例⼦
枚举(访问和取出)字典的键和对应值,认为对应值必须通过键来访问,往往会这样做:
青春有你2前九名
my_dict = {'a':1,'b':2}
for key in my_dict:
print(key, my_dict[key])
有⼀个更优雅的⽅法可以实现:
my_dict = {'a':1,'b':2}
for key, value in my_dict.items():
print(key, value)
对⼤部分项⽬来说,这样写会更加有效率。
Python 是⼀门⾮常容易⼊门的语⾔,严格的缩进要求和丰富的内置数据类型严格的缩进要求和丰富的内置数据类型,使得⼤部分 Python 代码都能做到⽐较好的规范。但是,不严格要求⾃⼰,也很容易就写出犯⼆的代码。