Loading

三元表达式、生成式,匿名函数,内置函数

今日内容概要

  • 三元表达式(简化代码)
  • 各种生成式(简化代码)
  • 匿名函数(简化代码)
  • 常见重要内置函数
  • 常见内置函数补充

img

今日内容详细

三元表达式

使用场景:二选一的时候推荐使用三元表达式
		不推荐嵌套使用(语法看着太乱,不简洁,不容易读懂)
语法结构:值1 if 条件 else 值2

# 条件如果成立则使用值1(if前面的数据)
# 条件不成立则使用值2(else后面的数据)
# 使用例子:
普通的if判断:
a = 1
b = 2
if a > b:
    print(a)
else:
    print(b)
# 2
这样看是不是一个简单的功能,写出了四行代码,既麻烦又不好用,接下来看看三元表达式
# 三元表达式
res = a if a > b else b
print(res)  # 2

# 三元表达式嵌套(不推荐使用嗷,看看就行了)
res = a if a>b else( 2 if 2 == 3 else 666)
print(res)  # 666
#补充:if分支结构也有个简化版本,也是知道就行了
'''子代码块都只有简单的一行情况下 也可以简写  没有三元表达式简单 但是也有人用'''
a = 1
if a == 1:print('我是1')
else:print('阿巴阿巴阿巴')

列表生成式

'''
本质就是将数据集中的每一个元素,通过for循环来取出,再把每一个元素赋值一个变量来接收处理数据,然后再生成一个新列表,返回的结果也是那个新列表
'''
# 语法结构:
    新列表名 = [变量名 for 变量名 in 要处理的数据集]
普通情况:
name_list = ['jason','tuzi','jerry','tom']
# 需求:将列表中所有人的名字后面加上_DM
# 以平时的方法就是:
new_list  = []  # 创建一个空的列表用于存储修改之后的数据
for name in name_list:  # 循环获取表里面的名字
    res = name + '_DM'  # 将名字和_DM进行拼接赋值给res
    new_list.append(res)  # 添加到新列表
print(new_list)
# ['jason_DM', 'tuzi_DM', 'jerry_DM', 'tom_DM']

####列表生成式####
name_list = ['jason','tuzi','jerry','tom']
res = [name+'_DM' for name in name_list]
print(res)
#  ['jason_DM', 'tuzi_DM', 'jerry_DM', 'tom_DM']
'''
列表生成式还可以跟if使用,可以说是复杂用法,具备筛选能力
'''
name_list = ['jason','tuzi','jerry','tom']
res = [name+'_DM' for name in name_list if name == 'tuzi']
print(res)
# ['tuzi_DM']
# 列表声称是值可以出现for和if,但不能有else,因为会产生歧义,(for和if都能结合else)

字典生成式

语法结构:新字典名字 = {key:value for循环} 
    for循环取出每一个元素或者对应的元素值,生成一个新字典
l1 = ['name', 'age', 'pwd']
l2 = ['tuzi', '18', '666']
# 需求:将上述两个列表分别制作成字典的键值

#一般情况:
new_dict = {}  # 定义一个字典
for i in range(len(l1)):  # 循环出两个列表中的索引值对应的元素
    # print(i)
    new_dict[l1[i]] = l2[i]  # 索引取值添加到字典
print(new_dict)

'''字典生成式'''
res = {l1[i]: l2[i] for i in range(len(l1))}
print(res)
# {'name': 'tuzi', 'age': '18', 'pwd': '666'}
也可以跟if使用,跟列表的原理一样
res = {l1[i]: l2[i] for i in range(len(l1)) if i == 2}
print(res)
#{'pwd': '666'}

集合生成式

语法结构:
    新集合名 = {变量名 for 变量名 in 循环条件}
    跟字典类似,只不过不是KV值
使用方法:
    生成1到10自然数
# 普通方法:
res = {}
res = set(res)  # 大括号为空默认为字典,所以转换一下
for i in range(10):
    res.add(i)
print(res)
# {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
### 集合生成式
res = {i for i in range(10)}
print(res, type(res))
# 也可以使用if进行判断
res = {i for i in range(10) if i != 2}
print(res, type(res))

总结

"""
我们可以看到三种生成式的语法结构都离不开for循环,其实本质就是for循环取出每一个元素,交给前面的变量名进行加工处理,从而生成出一个你想要的一个数据集
"""

img

匿名函数

匿名函数当然是没有函数名字的了
匿名函数不能调用,需要结合其他函数一起使用
匿名函数语法结构:
    lambda 形参:返回值
对比普通函数
	def func1(a)
    return a + 2
func1(1)

# 匿名函数实现上面普通函数功能方式
print(lambda a: a + 2)
lambda结合一些简单的方法:
max:统计最大值
l1 = [1,12,22,33,44,55,66,77,88]
print(max(l1))  # 直接获取数据集中最大的元素值
info = {
    'tuzi': 888,
    'jason': 9999999,
    'Bom': 66666,
    'Abaaba': 111
}
print(max(info))  # tuzi
'''
max底层可以看成是for循环一次比较,所以在比较字典的时候只能取到K值,如果K里面是字符串的英文字母,就会按照ASCII码表转成数字比较
	A-Z  65-90
	a-z  97-122
'''
def index(k):
    return info[k]
print(max(info,key=index))  # K对应的函数返回什么max就以什么做比较的依据
# 比较的是V返回的是K  key相对于是可以更改比较规则的参数
上面的代码还可以写为:
print(max(info,key=lambda key:info[key]))  # jason

*常见重要内置参数

# map映射
l1 = [11,22,33,44,55]
需求:元素全部自增10
# 方式1:
l1 = [11,22,33,44,55]
res = [i+10 for i in l1]
print(res)
# [21, 32, 43, 54, 65]

# 方式2:内置函数
# 列表
def func1(a):
    return a + 10
res = map(func1, l1)  # <map object at 0x000002AD88023080>  迭代器(节省空间,还没学0.0)
print(list(res))
[21, 32, 43, 54, 65]
# 简写
res = map(lambda a: a + 10, l1)
print(list(res))
# 字典:
info = {
    'tuzi': 888,
    'jason': 9999999,
    'Bom': 66666,
    'Abaaba': 111
}
res = map(lambda a:a+'666',[i for i in info])
print(list(res))  # ['tuzi666', 'jason666', 'Bom666', 'Abaaba666']
# 集合
set1 = {1, 2, 3, 4, 5, 6, 7, 8, 9}
res = map(lambda a: a + 10, [i for i in set1])
print(set(res))
# {11, 12, 13, 14, 15, 16, 17, 18, 19}
# zip拉链  暂时理解为用来整合数据的
列表整合:
l1 = [11, 22, 33, 44, 55]
l2 = ['tuzi', 'jason', 'tony','tom','jerry']
res = zip(l1,l2)  # <zip object at 0x0000022470D93688> 也是一个迭代器,转换一下
print(list(res))  #[(11, 'tuzi'), (22, 'jason'), (33, 'tony'), (44, 'tom'), (55, 'jerry')]
# 字典整合:
info = {
    'tuzi': 888,
    'jason': 9999999,
    'Bom': 66666,
    'Abaaba': 111
}
info1 = {
    'mytf':100,
    'dddd':200,
    'cpdd':300,
    'bhqm':400
}
res = zip(info,info1)
print(dict(res))
#{'tuzi': 'mytf', 'jason': 'dddd', 'Bom': 'cpdd', 'Abaaba': 'bhqm'}
# 直接使用会把两个字典的K值重新组成KV键值对
'''zip也可以整个多个数据集,如果数据集之间个数不一致,那么就依据短的'''
l1 = [11, 22, 33]
l2 = ['tuzi', 'jason', 'tony','tom','jerry']
res = zip(l1,l2)  
print(list(res))  
# [(11, 'tuzi'), (22, 'jason'), (33, 'tony')]
# filter过滤
l1 = [11, 22, 33, 44, 55]
# 筛选出大于30的元素
# 方式1 列表生成式
res = [i for i in l1 if i > 30]
print(res)
# 方式2 内置函数filter
def func1(a):
    return a > 30
res = filter(func1, l1)
print(list(res))  # [33, 44, 55]
# 简写
res = filter(lambda a: a > 30, l1)
print(list(res))  # [33, 44, 55]
# reduce 归总
l1 = [11, 22, 33]
'''需求:讲列表中所有的元素相加'''
# 列表生成式:也能得到结果,但是不明确
l1 = [11, 22, 33]
res = [i+i for i in l1]
print(res)  # [22, 44, 66]


# reduce函数方法:
from functools import reduce
def func1(a, b):
    return a + b
res = reduce(func1,l1)
print(res)

# 简写
res = reduce(lambda a,b:a+b,l1)
print(res)  # 66
# 还可以再跟一个数字来相加
res = reduce(lambda a,b:a+b,l1,100)
print(res)  # 166
# 相当于在原来的结果上再加100

img

常见内置函数

  • abs() 获取绝对值
print(abs(-123))  # 123
print(abs(123))  # 123
  • all() 与 any()

    原理相当于逻辑运算符的and与or,但是要注意空列表或空元组的返回值是True

l1 = [0,1,0,True]
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() 类型转换
s = '天青色等烟雨,ABCD'
# 编码:
print(s.encode('utf8'))
#b'\xe5\xa4\xa9\xe9\x9d\x92\xe8\x89\xb2\xe7\xad\x89\xe7\x83\x9f\xe9\x9b\xa8,ABCD'
print(bytes(s,'utf8'))
#b'\xe5\xa4\xa9\xe9\x9d\x92\xe8\x89\xb2\xe7\xad\x89\xe7\x83\x9f\xe9\x9b\xa8,ABCD'
# 解码
s1 = b'\xe5\xa4\xa9\xe9\x9d\x92\xe8\x89\xb2\xe7\xad\x89\xe7\x83\x9f\xe9\x9b\xa8,ABCD'
res = s1.decode('utf8')
print(res)  # 天青色等烟雨,ABCD
###########
print(str(s1,'utf8'))  # 天青色等烟雨,ABCD
'''
对于编码和解码可以使用encode和decode
也可以使用bytes和str
'''
  • callable() 判断当前对象是否可以加括号调用
s = '123'
def func1():pass
print(callable(s))  # Flase  变量名不能加括号调用
print(callable(func1))  # True  函数名可以加括号用
  • chr() ord()

    字符与数字的对应转换

print(chr(36))  # $  根据数字转字符  依据ASCII码
print(ord('!'))  # 44  根据字符转数字  依据ASCII码
  • dir()

    返回数据类型可以调用的内置方法(查看对象内部可调用的属性)

print(dir(123))
# ['bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
print(dir('字符串'))
# '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()

    把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。

'''第一个是整数部分,第二个是余数部分'''
divmod(7, 2)
# (3, 1)
divmod(8, 2)
# (4, 0)
def get_yeshu(sj,ys):
    more,others = divmod(sj,ys)
    if others:  # 意思是如果有剩余的就再让页数+1
        more += 1
    print(f'需要{more}页')
get_yeshu(10000,30)  # 需要334页

  • enumerate() 枚举
l1 = ['jason','tuzi','kevin','tom']
for i,j in enumerate(l1):
    print(i,j)
# 输出结果:
# 0 jason
# 1 tuzi
# 2 kevin
# 3 tom
for i,j in enumerate(l1,start = 1):  # start可以控制起始位置,默认起始位置是0
  • eval(res) 只能识别简单逻辑的python代码
  • exec(res) 能够识别具有与一定逻辑的python代码
res = "print('yyyyyyyy')"
eval(res)  # yyyyyyyy
exec("""for i in range(5):
     print ("计数: %d" % i)
 """)
# 计数: 0
# 计数: 1
# 计数: 2
# 计数: 3
# 计数: 4
"""
exec与eval语句的主要区别是,
1.exec把字符串转化成一个python代码执行,而eval从一个表达式里返回值。
2、exec没有返回值,eval有返回值
"""

img

posted @ 2022-03-22 23:21  香菜根  阅读(155)  评论(0编辑  收藏  举报