三元表达式、生成式、常见内置函数

今日内容总结

一、三元表达式(简化代码)

二、各种生成式(简化代码)

三、匿名函数(简化代码)

四、常见重要内置函数

五、常见内置函数补充

一、三元表达式

使用场景:在二选一时,推荐使用三元表达式
""" 三元表达式:
        数据1 if 条件 else 数据2
    在条件成立时则使用数据1(if前面的数据)
    在条件不成立时则使用数据2(else后面的数据) """
# 当获取数字为1时,为熊大,否则为熊二
num = input('number>>>:').strip()
res = '熊大' if num == '1' else '熊二'
print(res)

针对if分支结构,也有简化版本
"""子代码块都只有简单的一行情况下,也可以简写,但没有三元表达式简单"""
name = '熊大'
if name == '熊大': print(name)
else: print('熊二')
# 其实就是在缩进下一行时,选择直接在冒号后面添加输出内容

二、各种生成式

1 、列表生成式

# 使用for循环
# 定义一个原列表
name_list = ['熊大', '熊二', '吉吉国王', '光头强', '翠花']
# 在每个名字后面加_YYDS
new_list = []
# 使用for循环获取人名、
for name in name_list:
    res = name + '_YYDS'
    new_list.append(res)
print(new_list)
# ['熊大_YYDS', '熊二_YYDS', '吉吉国王_YYDS', '光头强_YYDS', '翠花_YYDS']

# 使用列表生成式
name_list = ['熊大', '熊二', '吉吉国王', '光头强', '翠花']
res = [name+'_YYDS'for name in name_list]
print(res)
# ['熊大_YYDS', '熊二_YYDS', '吉吉国王_YYDS', '光头强_YYDS', '翠花_YYDS']
# 只需要两行就可以完成

# 列表生成式还具备筛选能力
name_list = ['熊大', '熊二', '吉吉国王', '光头强', '翠花']
res = [name+'_YYDS'for name in name_list if name !='吉吉国王']
print(res,type(res))
# ['熊大_YYDS', '熊二_YYDS', '光头强_YYDS', '翠花_YYDS'] <class 'list'>

""" 列表生成式中可以使用for和if,不能使用else """

2 、字典生成式

l1 = ['name', 'age','pwd']
l2 = ['蜡笔小新', 5, 10]
# 将两个列表的组成一个字典
使用for循环
new_dict = {}
for i in range(len(l1)):
    new_dict[l1[i]] = l2[i]  # 字典增加键值对
print(new_dict)
# {'name': '蜡笔小新', 'age': 5, 'pwd': 10}
 
使用字典生成式
l1 = ['name', 'age','pwd']
l2 = ['蜡笔小新', 5, 10]
res = {l1[i]:l2[i] for i in range(len(l1))}  
print(res,type(res))
# {'name': '蜡笔小新', 'age': 5, 'pwd': 10} <class 'dict'>

3 、集合生成式

res = {i for i in range(6)}
print(res, type(res))
# {0, 1, 2, 3, 4, 5} <class 'set'>

三、匿名函数

匿名函数指没有函数名,需要和其他函数一起使用
匿名函数固定语法:
   lambda 形参:返回值
      lambda x:x+2
如果使用普通函数表示:
def index(x):
    return x + 2
eg:
   def func(x,y):
       return x*y
    print(func(3, 4))  # 12
使用匿名函数
 func = lambda x,y:x*y
 print(func(3, 4))  # 12

1 、max : 统计最大值

# 求最大值
l1 = [12, 13, 15, 20, 25, 38, 46, 50, 74]
print(max(l1))  # 74

求最大工资人的名字
info = {
    'Aason':99999,
    'Jacob':123,
    'zark':16,
    'berk':55
}
 print(max(info))  # zark
# 结果不是出来的是数字,而是人名,而且还不是第一个人的名字
 获取v值:
  def index(k):
        return info[k]
  print(max(info,key=index))  # Aason # 通过key对应函数返回值,max进行比较

若使用匿名函数:
print(max(info, key=lambda key:info[key]))  # Aason

"""
max底层可以看成ffor循环比较,针对字典默认只能获取到key,当获取到的是字符串的英文字母的时候,会根据ASCII码表对应的数字进行比较
   A ~ Z : 65 ~ 90
   a ~ z : 97 ~ 122
"""

qQNaNQ.jpg

四、常见函数内置函数

1 、map映射

map映射就是根据提供的函数对指定的序列做映射
l1 = [12, 24, 28, 34, 65]
需求:元素全部自增6
方法1:利用列表生成式
def index(n):
    return n + 6
res = map(index,l1)
print(list(res))  # [18, 30, 34, 40, 71]
方法2:内置函数
res = map(lambda x: x + 6, l1)
print(list(res))  # [18, 30, 34, 40, 71]

2 、zip拉链

从多个数据集中取出元素组合成一个新的数据集,返回一个列表
a = [1, 2, 3]
b = [4, 5, 6]
res = zip(a, b)
print(list(res))  # 因为直接打印res出来是迭代器,所以把它装化成列表打印出来
# [(1, 4), (2, 5), (3, 6)]

zip(*) 与 zip 相反,可理解为解压,返回原始的数据集
a1, a2 = zip(*zip(a,b))
print(list(a1))  # [1, 2, 3]
print(list(a2))  # [4, 5, 6]


'''zip可以整合多个数据集'''
a = [1, 2, 3]
b = [4, 5, 6]
c = ['熊大', '熊二', '翠花']
d = [123, 456, 789]
res = zip(a, b, c, d)
print(list(res))
# [(1, 4, '熊大', 123), (2, 5, '熊二', 456), (3, 6, '翠花', 789)]

不使用zip拉链
a = [1, 2, 3]
b = [4, 5, 6]
c = ['熊大', '熊二', '翠花']
d = [123, 456, 789]
res = [(a[i], b[i], c[i], d[i]) for i in range(len(a))]
print(res)

'''zip在整合多个数据集时,当数据集之间个数不一致,那么依据短的'''
b = [4, 5]
c = ['熊大', '熊二', '翠花']
res = zip(b, c)
print(list(res))  #[(4, '熊大'), (5, '熊二')]

3 、filter过滤

filter过滤函数接收两个参数,第一个为判断函数,第二个为判断对象,第二个的每个元素作为参数传递给判断函数,然后返回 True 或 False,最后将返回 True 的元素放到新列表中
l1 = [4, 5, 6, 7, 12, 14]
# 取出大于10的数字
方法1:利用列表生成式
def index(x):
    return x > 10
res = filter(index,l1)
print(list(res))  # [12, 14]
方法2:内置函数
res = filter(lambda x:x>10, l1)
print(list(res))  # [12, 14]

4 、reduce归总

from functools import reduce  # 固定
作用就是对序列中的元素进行累积

from functools import reduce
l1 = [1, 2, 3, 4, 5]
res = reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
print(res)
计算的流程就是((((1+2)+3)+4)+5)  # 15

五、常见内置函数补充

1、获取绝对值(不考虑绝对值)
print(abs(-123))  # 123
print(abs(123))  # 123

2.all()与any()  # 一个是全部,一个是任一
l1 = [2, 0, 1, 1, True]
print(all(l1))  # False  数据集中必须所有的元素对应的布尔值为True返回的结果才是True
print(any(l1))  # True   数据集中只要所有的元素对应的布尔值有一个为True 返回的结果就是True

3.bin() oct() hex()  产生对应的进制数
print(bin(100))  # 0b1100100  二进制
print(oct(100))  # 0o144  八进制
print(hex(100))  # 0x64  十六进制

4.bytes()  类型转换
s = '锄禾日当午'
print(s.encode('utf8'))  # b'\xe9\x94\x84\xe7\xa6\xbe\xe6\x97\xa5\xe5\xbd\x93\xe5\x8d\x88'
print(bytes(s, 'utf8'))  # b'\xe9\x94\x84\xe7\xa6\xbe\xe6\x97\xa5\xe5\xbd\x93\xe5\x8d\x88'
'''针对编码解码 可以使用关键字encode与decode  也可以使用bytes和str  ,bytes为编码、str为解码'''

5.callable()  判断当前对象是否可以加括号调用
name = 'owen'
def index():pass
print(callable(name))  # False  变量名不能加括号调用
print(callable(index))  # True  函数名可以加括号调用

6.chr()、ord()  字符与数字的对应转换
print(chr(71))  # G 根据数字转字符  使用ASCII码
print(ord('d'))  # 100 根据字符转数字  使用ASCII码

7.dir() 
返回数据类型可以调用的内置方法(查看对象内部可调用的属性)
print(dir(52))
print(dir('owen'))  
# 结果太长,不打印了,可以自己使用上面代码试试

# 8.divmod()
"""
可以使用在网站的分页制作上
      总共250条数据 每页展示25条 需要多少页   10页
       总共300条数据 每页展示25条 需要多少页   12页
        总共234条数据 每页展示25条 需要多少页   9页
"""
print(divmod(250,25))  # (10, 0)  第一个参数是整数部分 第二个是余数部分
print(divmod(300,25))  # (12, 0)
print(divmod(234,25))  # (9, 9)

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(1688,30)  # 需要57页


9.enumerate()  枚举
name_list = ['owen', 'kevin', 'wuxidixi', 'mary']
for i,j in enumerate(name_list):
    print(i,j)  # i类似于是计数 默认从0开始
0 owen
1 kevin
2 wuxidixi
3 mary

for i,j in enumerate(name_list,start=1):
    print(i,j)  # 还可以控制起始位置
1 owen
2 kevin
3 wuxidixi
4 mary
    
10.eval() exec()  识别字符串中的python代码,不常用
print('print("不错不错")')  # 不错不错
eval('print("不错不错123")')  # 不错不错123
exec('print("不错不错234")')  # 不错不错234
res = """
for i in range(10):
    print(i)
"""
eval(res)  # 报错  只能识别简单逻辑的python代码
exec(res)  # 0~9  能够识别具有与一定逻辑的python代码
exec可以执行动态Python代码
eval函数可以计算Python表达式,并返回结果(exec不返回结果)

qQ4zkQ.jpg

完毕~

posted @ 2022-03-22 23:03  未月  阅读(295)  评论(0)    收藏  举报