python表达式生成式和常见内置函数

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

posted @ 2022-03-22 20:55  洛阳城门听风雨  阅读(129)  评论(0)    收藏  举报