Day15读后有感
今日内容概要
-
三元表达式(简化代码)
-
各种生成式(简化代码)
-
匿名函数(简化代码)
-
常见重要内置函数
-
常见内置函数补充
三元表达式
语法结构
值1 if 条件 else 值2
条件如果成立则使用值1 (if前面的数据)
条件如果不成立则使用值2 (else后面的数据)
使用场景
三元表达式只用于二选一的情况
username = input('username>>>:').strip() res = '漂亮小姐姐' if username == 'anna' else '小姐姐' # 如果条件anna成立,那么打印漂亮小姐姐,输入其他就打印小姐姐 print(res)
最好不要嵌套使用(语法不简洁)
res = '下午' if 1 == 1 else (2 if 2==3 else '上午') # 不推荐
补充:针对if分支结构 也有简化版本(了解即可)
'''子代码块都只有简单的一行情况下 也可以简写 没有三元表达式简单 但是也有人用'''
name = 'jason' if name == 'jason': print(name) else: print('嘿嘿嘿')
各种生成式
1.列表生成式
name_list = ['jason', 'kevin', 'tony', 'oscar', 'jerry'] '''需求:将列表中所有的人名后面加上_棒棒哒''' # 以我们之前掌握的知识,可以用到for循环 # 1.创建一个空的列表用于存储修改之后的数据 new_list = [] # 2.for循环列表获取每一个人名 for name in name_list: # 'jason' 'kevin' 字符串 # 3.字符串末位拼接_棒棒哒 res = name + '_棒棒哒' # 4.添加到新的列表中 new_list.append(res) print(new_list) # 这样的书写方式好麻烦呀~ # 有没有简单的办法??请继续往下瞧 # 列表生成式:该技术可以简化代码 (就问你6不6) res = [name+'_棒棒哒' for name in name_list] # print(res) # 列表生成式复杂用法:还具备筛选能力(不能再6了) res = [name+'_棒棒哒' for name in name_list if name == 'jason'] print(res) res = [name+'_棒棒哒' for name in name_list if name != 'jason'] print(res)
2.字典生成式
l1 = ['name', 'age', 'pwd'] l2 = ['anna', 18, 188] # 需求:将上述两个列表分别制作成字典的键值 # 1.定义一个空字典 # new_dict = {} # 2.每次循环都要拿到两个列表中对应的元素(索引相等) # for i in range(len(l1)): # 3.索引取值即可 # new_dict[l1[i]] = l2[i] # print(new_dict) # 字典生成式 res = {l1[i]: l2[i] for i in range(len(l1))} print(res) # {'name': 'anna', 'age': 18, 'pwd': 188} res = {l1[i]: l2[i] for i in range(len(l1)) if i == 1} print(res) # {'age': 18}
3.集合生成式
res = {i for i in range(10)} print(res, type(res)) # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} <class 'set'> res = {i for i in range(10) if i != 2} print(res, type(res)) # {0, 1, 3, 4, 5, 6, 7, 8, 9} <class 'set'>
"""没有元组生成式 依据上述写法得到的是后续我们要学习的知识:迭代器"""
匿名函数 lambda 音译:兰姆达
函数的意思就是没有函数名,需要结合其他函数一起使用
语法结构
lambda 形参:返回值
# 定义匿名函数 lambda x: x+2 # 如果用普通函数来表示 # def index(x): # return x + 2 print(lambda x: x+2) # 运行结果是一个介绍,之前提到过匿名函数无法直接使用,需要结合其他函数一起使用
结合max:统计最大值来使用
l1 = [11,32,41,22,13,66,54,78,96,34,54,99,35] print(max(l1)) # 直接获取数据集中最大的元素值
info = { 'Aason':9999999, 'Jacob':123, 'zark':1000, 'berk':33 } # 求:薪资最高的人的姓名 print(max(info)) # zark ''' max底层可以看成是for循环依次比较 针对字典默认只能获取到k 获取到k之后如果是字符串的英文字母 则会按照ASCII码表转成数字比较 A~Z:65-90 a~z:97-122 ''' def index(k): return info[k] print(max(info,key=index)) # key对应的函数返回什么 max就以什么做比较的依据 # 比较的是v 返回的是k key相当于是可以更改比较规则的参数 # 上述代码可以简写 因为函数功能很单一 print(max(info, key=lambda key:info[key])) # Aason
常见重要内置函数
1.map映射
l1 = [11, 22, 33, 44, 55] # 需求:元素全部自增10 # 方式1:列表生成式 # 方式2:内置函数 def index(n): return n + 10 res = map(index,l1) print(list(res)) # 转成列表 代码结果[21, 32, 43, 54, 65] # 也可以使用匿名函数的方式 res = map(lambda x: x + 10, l1) # 转成匿名函数 print(list(res)) # 代码结果[21, 32, 43, 54, 65]
2.zip拉链
l1 = [11, 22, 33, 44] l2 = ['jason','kevin','tony','oscar'] # 需求:将两个列表中的元素一一对应成对即可 res = zip(l1,l2) print(res) # 目前想看里面的数据 用list转换一下即可 print(list(res)) # [(11, 'jason'), (22, 'kevin'), (33, 'tony'), (44, 'oscar')]
zip也可以整合多个数据集
l1 = [11, 22, 33, 44] l2 = ['jason','kevin','tony','oscar'] l3 = [1,2,3,4] l4 = [55,66,77,88] res = zip(l1,l2,l3,l4) print(list(res)) # [(11, 'jason', 1, 55), (22, 'kevin', 2, 66), (33, 'tony', 3, 77), (44, 'oscar', 4, 88)]
'''zip整合多个数据集 如果数据集之间个数不一致 那么依据短的'''
3.filter过滤
l1 = [11, 22, 33, 44, 55, 66] '''需求:筛选出大于30的元素''' # 方式1:列表生成式 # 方式2:内置函数 def index(x): return x > 30 res = filter(index,l1) print(list(res)) # [33, 44, 55, 66] res = filter(lambda x:x>30, l1) # 运用匿名函数 print(list(res)) # [33, 44, 55, 66]
4.内置函数之reduce归总
作用是将所有元素相加
'''以前是内置函数 现在是某个模块下面的子函数(后面讲)'''
from functools import reduce
l1 = [11, 22, 33] '''需求:讲列表中所有的元素相加''' def index(x,y): return x + y from functools import reduce res = reduce(index,l1) print(res) # 66
res = reduce(lambda x, y: x + y, l1) # 运用了匿名函数 print(res) # 66
res = reduce(lambda x, y: x + y, l1, 100) print(res) # 166 # 在列表中所有元素相加后再加100
常见内置函数
1.abs() 获取绝对值(不考虑正负号) print(abs(-123)) print(abs(123)) 2.all()与any() l1 = [0, 0, 1, 0, True] print(all(l1)) # False 数据集中必须所有的元素对应的布尔值为True返回的结果才是True print(any(l1)) # True 数据集中只要所有的元素对应的布尔值有一个为True 返回的结果就是True 3.bin() oct() hex() 产生对应的进制数 print(bin(100)) print(oct(100)) print(hex(100)) 4.bytes() 类型转换 s = '你好啊 hello world!' print(s.encode('utf8')) # b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a hello world!' print(bytes(s, 'utf8')) # b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a hello world!' '''针对编码解码 可以使用关键字encode与decode 也可以使用bytes和str''' s1 = '天黑了 抓紧进屋吧!!!' # 编码 res = bytes(s1, 'utf8') print(res) # 解码 res1 = str(res, 'utf8') print(res1) 5.callable() 判断当前对象是否可以加括号调用 name = 'jason' def index():pass print(callable(name)) # False 变量名不能加括号调用 print(callable(index)) # True 函数名可以加括号调用 6.chr()、ord() 字符与数字的对应转换 print(chr(65)) # A 根据数字转字符 依据ASCII码 print(ord('A')) # 65 根据字符转数字 依据ASCII码 7.dir() 返回数据类型可以调用的内置方法(查看对象内部可调用的属性) print(dir(123)) print(dir('jason')) 8.divmod() """ 可以使用在网站的分页制作上 问 总共250条数据 每页展示25条 需要多少页 10页 总共251条数据 每页展示25条 需要多少页 11页 总共249条数据 每页展示25条 需要多少页 10页 """ print(divmod(250,25)) # (10, 0) 第一个参数是整数部分 第二个是余数部分 print(divmod(251,25)) # (10, 1) print(divmod(249,25)) # (9, 24) def get_page_num(total_num,page_num): # 后面django分页器使用 more,others = divmod(total_num, page_num) if others: more += 1 print('需要%s页'%more) get_page_num(1000,30) 9.enumerate() 枚举 name_list = ['jason', 'kevin', 'oscar', 'tony'] for name in name_list: print(name) for i,j in enumerate(name_list): print(i,j) # i类似于是计数 默认从0开始 for i,j in enumerate(name_list,start=1): print(i,j) # 还可以控制起始位置 10.eval() exec() 识别字符串中的python代码 使用频率很低 print('print("有点饿了")') eval('print("有点饿了111")') exec('print("有点饿了222")') res = """ for i in range(10): print(i) """ eval(res) 只能识别简单逻辑的python代码 exec(res) 能够识别具有与一定逻辑的python代码 # ps:课外扩展 可以百度搜一搜两者的实际应用