python的代码简化方法
引言
今天开始我们讲点简单的内容,聊聊一些能够在一定情况下让代码简化的方法。

三元表达式
三元表达是一般运用在二选一的情况下,可以简化代码。另外补充一点就是针对if分支结构也有简化版本。
'''
三元表达式
值1 if 条件 else 值2
条件如果成立则使用值1(if前面的数据)
条件如果不成立则使用值2(else后面的数据)
'''
username = input('请输入用户名>>>:')
print('管理员' if username == 'king' else 'DSB')
'''
三元表达式只用于二选一的情况,最好不要嵌套使用(嵌套了程序看起来就不简洁了)
'''
# res = '下午' if 1 == 1 else (2 if 2==3 else '上午') # 不推荐
'''
记住一个前提简洁易读,不是代码越少做的事情越多就越牛逼
'''
'''
子代码块都只有简答的一行情况下,也可以简写,没有三元表达式简单,但是也有人用,只要看得懂就可以了
'''
name = input('请输入用户名>>>:')
if name == 'jason': print(name)
else: print('嘿嘿嘿')
各种生成式
列表生成式
# 当我们要给一个列表的元素都加相同内容,可以用列表生成式来做
ls_name = ['king', 'tom', 'jack', 'tim']
ls_res = [i + '_nb' for i in ls_name]
print(ls_res)
# 当然列表生成式还可以具备筛选能力
ls_rac = [i + '_best' for i in ls_name if i == 'king']
print(ls_rac)
'''由于列表生成式筛选中有for和if,这两者都可以用else,所以不能再复杂 列表生成式中用,会产生分歧'''
字典生成式
# 字典的生成式是将键值对的键和值分别放在两个列表中,然后进行的
l1 = ['name', 'age', 'pwd', 'gender']
l2 = ['king', 18, 123456, 'male']
dic_res = {l1[i]: l2[i] for i in range(len(l1))}
print(dic_res)
# 字典生成式也具有筛选能力,不过用处不大
dic_rac = {l1[i]: l2[i] for i in range(len(l1)) if i == 1}
print(dic_rac)
集合生成式
# 补充:创建空集合要用set()
set_res = {i for i in range(10)}
print(set_res)
# 集合生成式也具有筛选的能力
set_rac = {i for i in range(10) if i != 4}
print(set_rac)
生成式总结
相信通过上面的例子你也能发现一些规律,每个生成式最外面的括号都是和自身有关的,列表是中括号,字典和集合是花括号,然后字典和集合区别在于他们生成式中的元素一个是键值对一个是普通元素。当然元组没有生成式,类似形式的元组生成式得到的不是元组而是迭代器。

匿名函数
匿名函数就是没有函数名,是用lambda关键字来定义,需要结合其他函数一起是用。这里我就用max()函数来讲讲吧
# 匿名函数语法
lambda 参数:返回值
# max:获取最大值
l1 = [11, 22, 33, 55, 66, 77, 99]
print(max(l1)) # 99
# max可以获取数据集中的值最大的函数
dic_res = {
'king': 9999,
'tom': 8888,
'jack': 7777
}
print(max(dic_res)) # tom
'''
为什么上诉得到的是tom而不是king呢,因为max底层可以看作是for循环的遍历,而字典的值只能通过键得到,遍历得到的只是键,而在比较字符串的时候是先看第一个英文字母的ASCII码的大小,所以得到的是tom。
'''
'''
max还有一个参数key,key如果对应的地方有东西,那么就以key对应的地方返回的东西作为比较的依据,而返回的是被for循环遍历出来的结果。这个时候就可以结合匿名函数使用了。对于字典中拿到的值会自动被key中的函数调用。
'''
print(max(dic_res, key=lambda key:dic_res[key])) # king
常见重要内置函数
# 内置函数之映射map
'''
对于每个元素都进行相同操作可以用到映射
'''
l1 = [11, 55, 77, 88]
ls_res = map(lambda x: x + 10, l1)
print(list(ls_res)) # ls_res是迭代器,所以需要转换
# 一开始讲的列表生成式所作的操作,map映射也可以做,只不过要进行转换
ls_name = ['king', 'tom', 'jack', 'tim']
ls_rac = map(lambda x: x + '_nb', ls_name)
print(list(ls_rac))
# 内置函数之'拉链'zip
l1 = [1, 2, 3, 4, 5]
l2 = ['king', 'tom', 'tim', 'jack', 'jojo']
res = zip(l1, l2) # 迭代器
print(list(res))
'''
zip可以将多个数据集进行整合内部,为什么叫拉链是因为数据集之间如果元素个数不一样,那么依据短的,这个很想拉链。
'''
l2 = ['king', 'tom', 'tim', 'jack', 'jojo']
l3 = [1, 2, 3]
res = zip(l3, l2)
print(list(res)) # [(1, 'king'), (2, 'tom'), (3, 'tim')]
# 内置函数之过滤filter
'''
过滤就是筛选出满足条件的
'''
l1 = [11, 22, 33, 44, 55, 66, 77]
res = filter(lambda x: x > 30, l1)
print(list(res)) # [33, 44, 55, 66, 77]
# 内置函数之归总reduce
'''
reduce在以前是内置函数,现在成了某个模块下面的子函数,用来求数据集的元素和之类的
'''
l1 = [11, 22, 33, 44, 55]
from functools import reduce
res = reduce(lambda x, y: x + y, l1)
print(res) # 165
res_second = reduce(lambda x, y: x + y, l1, 100)
print(res_second) # 265
res_third = reduce(lambda x, y: x - y, l1)
print(res_third) # -143
res_four = reduce(lambda x, y: x - y, l1, 100)
print(res_four) # -65
'''
可以看出当只有2个参数时,x是数据集的第一个元素,然后y是第二个元素相互运算后得到的结果在下一次运算中是x,第三个元素为y一次进行。而三个参数我通过减法得到,第一次运算x取的是第三个参数的值,其它照旧。剩下的除法乘法都类似。
'''

常见内置函数
# 获取绝对值abs()
print(abs(-123)) # 123 得到的一定是个正数,0得到的就是0
# all()与any() 类似 and 和 or
l1 = [1, 0, 1, 0, True]
print(all(l1)) # False
print(any(l1)) # True
# 进制转换 bin() oct() hex()
print(bin(100)) # 0b1100100 二进制
print(oct(100)) # 0o144 八进制
print(hex(100)) # 0x64 十六进制
# 类型转换 bytes()
'''
可以当作另一种的编码方式
'''
s = '你好呀hello world, my name is king'
print(bytes(s, 'utf8'))
# b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x91\x80hello world, my name is king'
# 另一种解码
res = bytes(s, 'utf8')
print(str(res, 'utf8')) # 你好呀hello world, my name is king
# 判断当前对象能否加括号调用 callable()
'''
简单的讲就是当前对象加括号能不能执行
'''
name = 'king'
print(callable(name)) # False 很明显普通的变量名不可以
# 字符与数字的相互转换 chr() ord()
print(chr(65)) # A
print(ord('A')) # 65
# 查看对象内部可调用的属性 dir()
print(dir(123))
'''
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
'''
print(dir('king'))
'''
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
'''
# 得到整数结果和余数 divmod() 可以用于分页器
print(divmod(255, 25)) # (10, 5)
# 枚举 enumerate()
ls_name = ['king', 'tom', 'tim', 'jack']
for i, j in enumerate(ls_name): # 可以在元素前多一个数字标记,默认0开始,可以用start属性来改变默认。
print(i, j)
'''
0 king
1 tom
2 tim
3 jack
'''
for i, j in enumerate(ls_name, start=2):
print(i, j)
'''
2 king
3 tom
4 tim
5 jack
'''
# 可以用于以后的功能选择上,恰好默认为0开始为相应的索引值
# 识别字符串中的python代码 eval() exec()
res = "print('你好呀')"
eval(res) # 你好呀 用于简单逻辑的python代码
res = "for i in range(3):print(i)"
exec(res) # 用于能需要一定逻辑判断能力的python代码
'''
0
1
2
'''
'''
虽然我在网上没找到相应eval和exec的用途,但是我发现如果用这两个内置函数容易产生漏洞,让黑客有机可乘。
'''
