Python基础篇---表达式,生成式和内置函数

本章内容

      • 三元表达式

      • 各种生成式

      • 匿名函数

      • 内置函数

三元表达式


 现有题目场景:在两个中间选一个的情况。

# 题目一:编写一个求两个数中较大数的函数
def index(a, b):
    if a > b:
         return a
    else:  # 可以省略
         return b

# 题目二:如果用户名是jason则打印管理员 否则打印DSB
username = input('username>>>:').strip()
if username == 'jason':
     print('管理员')
else:
    print('DSB')

以上方法可以解决2选1的问题,但代码并不精简,所以我们可以使用“三元表达式”去解决。

"""
三元表达式
    值1 if 条件 else 值2
条件如果成立则使用值1(if前面的数据)
条件如果不成立则使用值2(else后面的数据)
"""
# 题目1:编写一个求两个数中较大数的函数
def index(a,b):
    res = a if a>b else b
    print(res)

# 题目二:如果用户名是jason则打印管理员 否则打印DSB
username = input('username>>>:').strip()
res = '管理员' if username == 'jason' else 'DSB'
print(res)

'''三元表达式只用于二选一的情况 最好不要嵌套使用(语法不简洁)'''

补充:针对if分支结构 也有简化版本(了解即可)。

name = 'jason'
if name == 'jason': print(name)
else: print('嘿嘿嘿')

 

各种生成式


列表生成式

需求:将下面的列表里的把一个人名后面加上_YYds。

name_list = ['jason', 'kevin', 'tony', 'oscar', 'jerry']

思考分析:给每一个函数加东西,先要取到每一个函数要用for循环,给字符串末尾加内容用拼接,然后把拼接好的每一个元素放进一个空的列表里。

思路的实现:

name_list = ['jason', 'kevin', 'tony', 'oscar', 'jerry']
# 1.创建一个空的列表用于存储修改之后
new_list = []
# 2.for循环列表获取每一个人名
for name in name_list:  # 'jason'    'kevin'   字符串
    # 3.字符串末位拼接_DSB
    res = name + '_DSB'
    # 4.添加到新的列表中
    new_list.append(res)
print(new_list)

问题是解决了,但是代码不简洁,有没有更好的方法呢?有的!就是列表生成式。

# 列表生成式:该技术可以简化代码 也可以不用 无外乎写的复杂一点而已
name_list = ['jason', 'kevin', 'tony', 'oscar', 'jerry']
res = [name+'_YYds' for name in name_list]
print(res)  # ['jason_YYds', 'kevin_YYds', 'tony_YYds', 'oscar_YYds', 'jerry_YYds']

# 列表生成式复杂用法:还具备筛选能力

res = [name+'_SB' for name in name_list if name == 'jason']
print(res)  # ['jason_SB']
res = [name+'_SB' for name in name_list if name != 'jason']
print(res)  # ['kevin_SB', 'tony_SB', 'oscar_SB', 'jerry_SB']

'''列表生成式中值允许出现for和if 不能出现else 因为会产生歧义(for和if都能结合else)'''

字典生成式

需求:将下述两个列表分别制作成字典的键值。

l1 = ['name', 'age', 'pwd']
l2 = ['jason', 18, 123]

思路分析:根据给定的两个列表,我们可以看出需要制作的字典的键值对就是安装l1的元素为键,l2的元素为值,索引又相同,主要for循环取索引结合起来就可以了。

实现的代码:

l1 = ['name', 'age', 'pwd']
l2 = ['jason', 18, 123]
# 1.定义一个空字典
new_dict = {}
# 2.每次循环都要拿到两个列表中对应的元素(索引相等)
for i in range(len(l1)):
    # 3.索引取值即可
    new_dict[l1[i]] = l2[i]
print(new_dict)   # {'name': 'jason', 'age': 18, 'pwd': 123}

和列表生成式一样,上述的问题也可以采用字典生成式去解决,实现代码的优化。

# 字典生成式
res = {l1[i]: l2[i] for i in range(len(l1))}
print(res)  # {'name': 'jason', 'age': 18, 'pwd': 123}
res = {l1[i]: l2[i] for i in range(len(l1)) if i == 1}
print(res)  # {'age': 18}

集合生成式

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'>

PS:没有元组生成式 依据上述写法得到的时候后续我们要学习的知识:迭代器

  

匿名函数


匿名函数的意思就是没有函数名,没有函数名的函数如何调用呢?需要结合其他函数一起使用。

匿名函数的定义

# 定义匿名函数
lambda x:x+2
"""
lambda 形参:返回值
如果用普通函数来表示
def index(x):
    return x + 2
"""

应用例子:

salaries={
    'egon':3000,
    'alex':100000000,
    'jason':10000,
    'tom':2000
}
def get(k):
    return salaries[k]
# max:统计最大值
print(max(salaries,key=get))   # key对应的函数返回什么 max就以什么做比较的依据
print(max(salaries,key=lambda x:salaries[x]))  # 利用匿名函数直接写,不需要在全局里定义函数

'''
max底层可以看成是for循环依次比较 针对字典默认只能获取到k
获取到k之后如果是字符串的英文字母 则会按照ASCII码表转成数字比较
'''

 

内置函数


Python解释器自带的函数叫做内置函数,这些函数可以直接使用,不需要导入某个模块。

常见重要内置函数

1.内置函数之 map映射

# 需求:元素全部自增10
l1 = [11, 22, 33, 44, 55]
# 方式1:列表生成式
def index(n):
    return n + 10
res = map(index,l1)
print(res)  # 迭代器(节省空间的 目前不用考虑)
print(list(res))  # [21, 32, 43, 54, 65]
# 方式2:内置函数
# map()语法    map(function, iterable, ...)  function -- 函数   iterable -- 一个或多个序列
# 对l1里的每一个元素执行匿名函数的操作
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']
# zip() 将2或多个可迭代的对象里的参数按照相同的索引组成元组,在把每个元组组成列表返回
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也可以
res1 = [(l1[i],l2[i],l3[i],l4[i]) for i in range(len(l1))]
print(res1)  # [(11, 'jason', 1, 55), (22, 'kevin', 2, 66), (33, 'tony', 3, 77), (44, 'oscar', 4, 88)]
'''zip可以整合多个数据集 如果数据集之间个数不一致 那么依据短的'''
l1 = [11, 22, 33, 44, 55]
l2 = ['jason', 'kevin']
res = zip(l1,l2)
print(list(res))  # [(11, 'jason'), (22, 'kevin')]

3.内置函数之filter过滤

# 需求:筛选出大于30的元素
l1 = [11, 22, 33, 44, 55, 66]
# 方式1:列表生成式
def index(x):
    return x > 30
res = filter(index,l1)
print(list(res))  # [33, 44, 55, 66]
# 方式2:内置函数
# filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
# 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,
# 然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
res = filter(lambda x:x>30, l1)
print(list(res))  # [33, 44, 55, 66]

4.内置函数之reduce归总

# 在python2.x版本中 reduce是内置函数,python3.x中需要加入模块
from functools import reduce
l1 = [11, 22, 33]
'''需求:讲列表中所有的元素相加'''
def index(x,y):
    return x + y
# reduce() 函数会对参数序列中元素进行累积。
# reduce(function, sequence, initial=None)  函数  可迭代对象  初始值默认问none
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

 

 

常见内置函数

1.abs()  获取绝对值(不考虑正负号)

print(abs(-123))  # 输出123
print(abs(123))   # 输出123

2.all()与any()  判断全部元素的布尔值和true的关系

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))  # 输出0b1100100
print(oct(100))  # 输出0o144
print(hex(100))  # 0x64

 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')  # 编码 
res1 = str(res, 'utf8')  # 解码

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()  函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。  

divmod(7, 2)
(3, 1)  # 整除为3 余数为1
divmod(8, 2)
(4, 0)  # 整除为4 余数为0

9.enumerate()  枚举 

seasons = ['Spring', 'Summer', 'Fall', 'Winter']
list(enumerate(seasons))  # 把seasons里的元素和其索引值组成一个元组,以列表的形式传出
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
list(enumerate(seasons, start=1))       # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

10.eval() exec()  识别字符串中的python代码

print('print("有点饿了")')  # print("有点饿了")
eval('print("有点饿了111")')  # 有点饿了111  只能识别简单逻辑的python代码
exec('print("有点饿了222")')  # 有点饿了222  能够识别具有与一定逻辑的python代码

 

posted @ 2022-03-22 18:55  早安_1207  阅读(95)  评论(0)    收藏  举报
返回顶端