python表达式生成式和常见内置函数
三元表达式
#使用场景:二选一的时候 推荐使用三元表达式
#寻常代码:
def index(a,b):
if a>b:
return a # 如果a>b则输出a
else:
return b # 如果a<b则输出b
'不够简洁比较繁琐'
三元表达式
值1 if 条件 else 值2
条件如果成立则使用值1(if前面的数据)
条件如果不成立则使用值2(else后面的数据)
#代码示例:
def index(a,b):
res = a if a > b else b
print(res)
index(9,7) # 9
'''三元表达式只用于二选一的情况 最好不要嵌套使用(语法不简洁)'''
# 写一个电影系统 需要决定电影是否收费
is_change = input('是否收费>>>:').strip()
is_free = '收费' if is_change == 'y' else '免费'
print(is_free)
# 针对if分支结构 也有简化版本 (了解即可)
'''子代码块都只有简单的一行情况下 也可以简写 没有三元表达式简单 但是也有人用'''
name = 'jason'
if name == 'jason': print(name)
else: print('111')
各种生成式
列表生成式
#定义:
python里面[]表示一个列表,快速生成一个列表可以用range()函数来生成。
对列表里面的数据进行运算和操作,生成新的列表最高效快速的办法,那就是列表生成式了
#循环代码:
'对列表数平方'
b = range(1, 11)
c = []
for i in b:
c.append(i*i)
print(c)
# 结果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#列表生成式代码:
'对列表数平方'
b = range(1, 11)
c = [x*x for x in b]
print(c)
# 结果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
列表生成式语法是固定的,[]里面for 前面是对列表里面数据的运算操作,后面跟平常for循序一样遍历去读取。运行后会自动生成新的列表
#列表生成式还具备筛选功能
#代码示例:
name_list = ['jason', 'kevin', 'tony', 'oscar', 'jerry']
res = [name+'_SB' for name in name_list if name == 'jason']
print(res)
res = [name+'_SB' for name in name_list if name != 'jason']
print(res)
'''列表生成式中值允许出现for和if 不能出现else 因为会产生歧义(for和if都能结合else)'''
#多个参数:
a = [1, 2, 3, 4, 5]
b = ["a", "b", "c", "d", "e"]
# 多个参数列表生成式
c = [str(x)+str(y) for x, y in zip(b, a)]
print(c)
# 结果:['a1', 'b2', 'c3', 'd4', 'e5']
字典生成式
#定义:
通过生成式可以更加简洁地生成字典
#代码示例:
l1 = ['a','b','c','d','e']
l2 = [1,2,3,4,5]
dict ={l1[i]:l2[i] for i in range(len(l1))}
print(dict)
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
集合生成式
#定义:
通过生成式可以更加简洁地生成集合
#代码示例:
res = {i for i in range(10)}
print(res, type(res))
res = {i for i in range(10) if i != 2}
print(res, type(res))
"""没有元组生成式 依据上述写法得到的时候后续我们要学习的知识:迭代器"""

匿名函数
#定义:
匿名函数就是不需要显式的指定函数名
关键字lambda表示匿名函数,冒号前面的n表示函数参数,可以有多个参数。
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果
#匿名函数优势:
因为函数没有名字,不必担心函数名冲突
此匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数
有些函数在代码中只用一次,而且函数体比较简单,使用匿名函数可以减少代码量,看起来比较"优雅"

#这段代码
def calc(x,y):
return x**y
#换成匿名函数
calc = lambda x,y:x**y
print(calc(2,5))
def calc(x,y):
if x > y:
return x*y
else:
return x / y
#三元运算换成匿名函数
calc = lambda x,y:x * y if x > y else x / y
print(calc(2,5)) # 0.4
print(calc(5,2)) # 10
示例二
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
常见重要内置函数
map函数
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回
遍历序列,对序列中每个元素进行函数操作,最终获取新的序列

求列表[1,2,3,4,5,6,7,8,9],返回一个n*n 的列表
#代码示例:
li = [1,2,3,4,5,6,7,8,9]
res=map(lambda n:n*n,li)
print(list(res))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
zip函数
#定义
将列表中的元素一一对应
#代码示例:
l1 = ['a','b','c','d','e']
l2 = [1,2,3,4,5]
print(list(zip(l1,l2)))
print(dict(zip(l1,l2)))
#输出结果:
[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
'''zip可以整合多个数据集 如果数据集之间个数不一致 那么依据短的'''
filter函数
#定义:
filter()也接收一个函数和一个序列
filter()把传入的函数依次作用于每个元素
True '保留'
False '丢弃'

在一个列表中,删掉偶数,只保留奇数
#代码示例
li = [1, 2, 4, 5, 6, 9, 10, 15]
res = filter(lambda x: x % 2 == 1, li)
print(list(res)) # [1, 5, 9, 15]
reduce函数
#定义:
reduce把一个函数作用在一个序列[x1, x2, x3, ...]上
这个函数必须接收两个参数
reduce把结果继续和序列的下一个元素做累积计算
reduce(func,[1,2,3]) 等同于 func(func(1,2),3)


一个列表的求和求积
#代码示例
from functools import reduce
li = [1,2,3,4,5,6,7,8,9]
res = reduce(lambda x,y:x*y,li)
res1 = reduce(lambda x,y:x+y,li)
print(res) # 362880
print(res1) # 45
其他常见内置函数
abs()函数
#abs()函数返回数字的绝对值
print( abs(-45) ) # 返回 45
print("abs(0.2):",abs(0.2)) # 返回 abs(0.2): 0.2
all()函数any()函数
# all() 函数用于判断给定的参数中的所有元素是否都为 TRUE
# any() 函数用于判断给定的参数是否全部为False
l1 = [0, 0, 1, 0, True]
print(all(l1)) # False
数据集中必须所有的元素对应的布尔值为True返回的结果才是True
print(any(l1)) # True
数据集中只要所有的元素对应的布尔值有一个为True 返回的结果就是True
bin() oct() hex()函数
#产生对应的进制数
print(bin(100)) # 0b1100100
print(oct(100)) # 0o144
print(hex(100)) # 0x64
bytes()函数
#类型转换
'''针对编码解码 可以使用关键字encode与decode 也可以使用bytes和str'''
s1= 'hello 早上好'
# 编码
res = bytes(s1, 'utf8')
print(res) # b'hello \xe6\x97\xa9\xe4\xb8\x8a\xe5\xa5\xbd'
# 解码
res1 = str(res, 'utf8')
print(res1) # hello 早上好
divmod()函数
#函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)
print(divmod(250,25)) # (10, 0) 第一个参数是整数部分 第二个是余数部分
print(divmod(251,25)) # (10, 1)
print(divmod(249,25)) # (9, 24)
"""
可以使用在网站的分页制作上
问
总共250条数据 每页展示25条 需要多少页 10页
总共251条数据 每页展示25条 需要多少页 11页
总共249条数据 每页展示25条 需要多少页 10页
"""
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)
callable()函数
#判断当前对象是否可以加括号调用
name = 'jason'
def index():pass
print(callable(name)) # False 变量名不能加括号调用
print(callable(index)) # True 函数名可以加括号调用
chr()函数ord()函数
#字符与数字的对应转换
print(chr(65)) # A 根据数字转字符 依据ASCII码
print(ord('A')) # 65 根据字符转数字 依据ASCII码
enumerate()函数
#enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标
'一般用在 for 循环当中'
#代码示例:
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) # 还可以控制起始位置
dir()函数
#返回数据类型可以调用的内置方法(查看对象内部可调用的属性)
print(dir(123))
print(dir('jason'))
eval() 函数 exec() 函数
#eval() 函数用来执行一个字符串表达式,并返回表达式的值
#exec() 执行储存在字符串或文件中的Python语句
'能够识别具有与一定逻辑的python代码'
eval("print('Hello World')") # 执行简单的字符串
exec("for i in range(5): print('iter time is %d'%i)") # 执行复杂的for循环
# iter time is 0
# iter time is 1
# iter time is 2
# iter time is 3
# iter time is 4
