三元表达式
三元表达式,也称为if,else的紧凑形式。具体用法如下
def max(a,b):
if a>b:
return a
else:
return b
def max(a,b):
return a if a>b else b
上面这两个函数实现的功能是完全一样的。第二个函数中 a if a>b else b 就是一个三元表达式。 左边是条
件为真时返回的值,中间是判断条件,右边是条件假返回的值。
"""
三元表达式
值1 if 条件 else 值2
条件如果成立则使用值1(if前面的数据)
条件如果不成立则使用值2(else后面的数据)
"""
# 补充:针对if分支结构 也有简化版本(了解即可)
'''子代码块都只有简单的一行情况下 也可以简写 没有三元表达式简单 但是也有人用'''
name = '春游去动物园'
if name == '春游去动物园': print(name)
else: print('秋游去动物园')
各种生成式
列表生成式
'''
大致的格式如下 [表达式 for 变量 in 列表 if 条件] ,其中if条件是可选的。
'''
a = [i**2 for i in range(10)]
print(a)
#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
类似数学中的乘法分配律
a = [x*y for x in [1,2,3] for y in [4,5,6]]
print(a)
#[4, 5, 6, 8, 10, 12, 12, 15, 18]
列表生成式复杂用法:还具备筛选能力
a = [i for i in range(10) if i>=5]
print(a)
#[5, 6, 7, 8, 9]
'''列表生成式中值允许出现for和if 不能出现else 因为会产生歧义(for和if都能结合else)'''
字典生成式
#定义两个列表(索引值必须相等)
list1 = ['a','b','c','d']
list2 = ['1','2','3','4']
字典生成式
dic = {list1[i]:list2[i] for i in range(len(list1))}
print(dic)
执行结果:
{'a': '1', 'b': '2', 'c': '3', 'd': '4'}
#实现字典的key和value快速交换:
dic1={'a':1,'b':2}
dic2={v: k for k, v in dic1.items()}
print(dic2) #{1: 'a', 2: 'b'}
集合生成器
a = {i for i in range(10)}
print(a)
#{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
a = {i for i in range(10) if i != 2}
print(a)
#{0, 1, 3, 4, 5, 6, 7, 8, 9}
匿名函数
1.概念
匿名函数其实就是lambda表达式
语法 : lambda 形参列表:函数体
# 匿名函数
def text(x, y):
result = x + y
lambda x, y: x + y
"""
def text(x, y) 是def的声明部分,return x+y 是实现部分
lambda x,y是声明部分,x + y是实现部分
"""
匿名函数和正常函数的区别
def test():
print("test")
# 打印出函数,和函数的类型
print(test, type(test))
test() # 调用函数
'''
匿名函数不需要使用return进行值的返回,只需要将结果书写在函数体的部分,
值会被自动返回
'''
r1 = lambda: True
print(r1,type(r1))
print(r1())
执行结果
<function test at 0x01BA96A0> <class 'function'>
test
<function <lambda> at 0x01CC2E38> <class 'function'>
True
根据运行结果可以发现,
定义的函数,有test的函数名称,而使用匿名函数的 没有名称 函数的名称为 lambda函数
正常的函数调用时直接函数名(),而使用匿名函数是需要打印,或者赋值打印的
匿名函数的函数体可以直接写打印语句,但是返回值则为None
def test1():
print("test1")
print(test1())
r2 = lambda: print("lambda_print")
print(r2())
执行结果
test1
None
lambda_print
None
有参数的匿名函数
r1 = lambda x: x ** 3 # 传递一个x,然后给x三次方,并返回
print(r1(2)) # 打印2的三次方
r2 = lambda x, y: x + y # 传递一个x和y,然后给相加,并返回
print(r2(3, 5)) # 打印3+5
执行结果
8
8
匿名函数可以使用默认参数,关键字参数,不定长参数
r1 = lambda x, y=5: x + y # 默认参数
print(r1(2))
print(r1(2, 10))
print(r1(x=8, y=9)) # 关键字参数
r2 = lambda *a: a # 不定长参数 ,*a:代表可以输入多个或者0个值
print(r2(1, 2, 3, 4, 5, 6))
执行结果
7
12
17
(1, 2, 3, 4, 5, 6)
常见重要内置函数
1.map映射
map:使用指定方法去作用传入的每个可迭代对象的元素,生成新的可迭代对象
l1 = [11, 22, 33, 44, 55]
res = map(lambda x: x + 10, l1)
print(list(res)) # [21, 32, 43, 54, 65]
2.zip
zip:聚合传入的每个迭代器中相同位置的元素,返回一个新的元组类型迭代器
x = [1, 2, 3] # 长度3
y = [4, 5, 6, 7, 8] # 长度5
print(zip(x, y)) # <zip object at 0x01739F48>
print(list(zip(x, y))) # 取最小长度3 [(1, 4), (2, 5), (3, 6)]
'''zip可以整合多个数据集,zip可以整合多个数据集 如果数据集之间个数不一致 那么依据短的'''
3.filter
filter:使用指定方法过滤可迭代对象的元素
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
def if_odd(x): #定义奇数判断函数
return x%2==1
print(list(filter(if_odd,a))) # [1, 3, 5, 7, 9]
print(list(filter(lambda x:x%2==1,a))) # [1, 3, 5, 7, 9]
4.reduce归总
reduce()函数也是Python内置的一个高阶函数。
python 3.0以后, reduce已经不在built-in function里了, 要用它就得导包(from functools import reduce)
reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传
入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
def f(x, y):
return x + y
reduce(f, [1, 3, 5, 7, 9])
调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
先计算头两个元素:f(1, 3),结果为4;
再把结果和第3个元素计算:f(4, 5),结果为9;
再把结果和第4个元素计算:f(9, 7),结果为16;
再把结果和第5个元素计算:f(16, 9),结果为25;
由于没有更多的元素了,计算结束,返回结果25。
reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:
reduce(f, [1, 3, 5, 7, 9], 100)
结果为125。
我们也可以使用匿名函数:
from functools import reduce
L=reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
print(L) # 15
常见内置函数
1.abs() 获取绝对值
print(abs(-666)) # 666
print(abs(666)) # 666
2.all和any
all:判断可迭代对象的每个元素是否都为True值
any:判断可迭代对象的元素是否有为True值的元素
print(all([1, 2])) # 列表中每个元素逻辑值均为True,返回True
print(all([0, 1, 2])) # 列表中0的逻辑值为False,返回False
print(any([0, 1, 2])) # 列表元素有一个为True,则返回True
print(any([0, 0])) # 列表元素全部为False,则返回False
3.bin() oct() hex()
bin:将整数转换成2进制字符串
oct:将整数转化成8进制数字符串
hex:将整数转换成16进制字符串
4.bytes()
bytes:根据传入的参数创建一个新的不可变字节数组
bytes('中文','utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
和str配合使用可以实现编码和解码的功能
a = bytes('中文','utf-8')
print(a) # b'\xe4\xb8\xad\xe6\x96\x87'
res1 = str(a, 'utf8')
print(res1) # 中文
5.callable()
callable:检测对象是否可被调用
a = 1
def f1():
pass
print(callable(a)) #False
print(callable(f1)) #True
6.chr()、ord()
chr:返回整数所对应的Unicode字符
ord:返回Unicode字符对应的整数
b = 6666
print(chr(b)) # ᨊ
a = '吕'
print(ord(a)) # 21525
7.dir()
dir:返回对象或者当前作用域内的属性列表
返回数据类型可以调用的内置方法(查看对象内部可调用的属性)
print(dir(666))
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__',
'__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__',
'__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__',
'__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__',
'__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__',
'__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__',
'__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__',
'__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__',
'__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag',
'is_integer', 'numerator', 'real', 'to_bytes']
8.divmod()
divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组
print(divmod(7, 2)) # (3, 1)
使用案例:
"""
可以使用在网站的分页制作上
问
总共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) # 需要34页
9.enumerate()
enumerate:根据可迭代对象创建枚举对象
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
print(list(enumerate(seasons)))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
print(list(enumerate(seasons, start=1)))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
for i in enumerate(seasons,start=1):
print(i)
执行结果
(1, 'Spring')
(2, 'Summer')
(3, 'Fall')
(4, 'Winter')
for i,j in enumerate(seasons,start=1):
print(i,j)
执行结果
1 Spring
2 Summer
3 Fall
4 Winter
10.eval() exec()
识别字符串中的python代码
res = """
for i in range(10):
print(i)
"""
eval(res) # 报错 (SyntaxError: invalid syntax)
exec(res) # 可以正常执行
区别:
eval函数:计算指定表达式的值。也就是说它要执行的Python代码只能是单个运算表达式(注意
eval不支持任意形式的赋值操作),而不能是复杂的代码逻辑,这一点和lambda表达式比较相似。
exec函数:动态执行Python代码。也就是说exec可以执行复杂的Python代码,而不像eval函数那
么样只能计算一个表达式的值。
eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。
eval()函数可以有返回值,而exec()函数返回值永远为None。
课堂练习
'''
编写一个二分法(快排)和装饰器
统计二分法(快排)执行的时间 数据自己模拟
'''
import time
def f1(func):
def f2(*args,**kwargs):
a = time.time()
time.sleep(1)
func(*args,**kwargs)
b = time.time()
print('用时:',b-a)
return f2
arr = [2, 3, 4, 10, 40]
max = len(arr)
@f1
def select_num(arr_list, r, max, min=0):
if max >= min:
mid = (max + min) // 2
if arr_list[mid] == r:
print('找到了')
return
if r < arr[mid]:
return select_num(arr_list, r, mid - 1, min)
else:
return select_num(arr_list, r, max, mid + 1)
else:
print('找不到')
return
select_num(arr, 4, max) # 找到了
select_num(arr, 1, max) # 找不到