函数使用
零碎知识
-
灵活的if-else
a = 3 if False else 5 # 上下两种写法等价 # if False: # a = 3 # else: # a = 5 print(a)
-
灵活的and/or
# 前面的表达式为真,才会执行后面的表达式 a = True and 3 print(a) # 前面的表达式为假,后面的表达式根本无需执行 b = False and 5 print(b) # 前面的表达式值真,后面的表达式无需执行 c = True or 3 print(c) # 前面的表达式为假,需要后面表达式的判断 d = False or 5 print(d)
-
类型判断
a = 250 # print(type(a)) # if type(a) == int: if type(a) == type(1): print('a', '是一个整数') # 判断一个对象是不是某种类型的一个实例 print(isinstance(a, int)) print(isinstance(a, str)) def test(): pass # print(type(test)) # 用能使用这种方式进行函数类型的判断 # print(isinstance(test, function)) from inspect import isfunction # 判断一个标识符是否是函数 print(isfunction(test)) print(isfunction(a))
-
变量地址
# 获取变量地址 print(id(a)) b = 10 print(id(b)) # a和b地址相同 lt = [1, 2, 3] print(id(lt)) lt2 = [1, 2, 3] print(id(lt2)) # lt和lt2地址不同
生成器
-
使用场景:
在使用列表时,很多时候我们不会一下子使用数据,通常都是一个一个使用;当数据量较大的时候,定义一个列表会是程序内存占用突然增大,为了解决此类问题,python中引入了生成器。
-
生成方式:
- 方式1:将列表生成式的[]改为()即可
# 列表生成式 # lt = [i for i in range(10)] # print(lt) lt = (i for i in range(3)) print(lt) # 可以转换为列表 # print(list(lt)) # 可以进行遍历 # for i in lt: # print(i) # 可以一个一个提取,当提取结束后再次提取会报StopIteration错 print(next(lt)) print(next(lt)) print(next(lt)) print(next(lt))
- 方式2:在函数中使用yield关键字
''' # 当数据量特别大的时候,占用内存会突然增大 def test(n): lt = [] for i in range(1, n+1): lt.append(i) return lt print(test(10)) ''' def test(n): for i in range(1, n+1): # 执行到此处,函数会返回yield后的内容,然后会停止在这里 yield i t = test(3) # print(t) # 可以一个一个提取 # print(next(t)) # print(next(t)) # print(next(t)) # 可以遍历 # for i in t: # print(i) # 可以转换为列表 print(list(t))
-
使用说明:
- 生成器对象保存的是特定数据的生成算法,而不是特定的所有数据
- 使用任意一种方式操作,都是单次的
- 生成器可以做的操作:遍历、next、转换为列表
迭代器
-
定义:能够使用for-in进行遍历,并且可以使用next函数进行迭代的对象
-
说明:
- 生成器就是一种特殊的迭代器
- 判断一个对象是否是迭代器
from collections import Iterator # 判断是否是迭代器 print(isinstance(lt, Iterator))
- 字符串及容器类型的对象都不是迭代器,他们都是可迭代对象
可迭代对象
-
定义:可以使用for-in遍历的对象,都是可迭代对象
扫描二维码关注公众号,回复: 4665021 查看本文章 -
说明:
- 前面学习过的字符串及容器类型的对象都是可迭代对象
- 迭代器一定是可迭代对象
- 判断一个对象是否是可迭代对象
from collections import Iterable, Iterator lt = [1, 2, 3] # 判断是否是可迭代对象 print(isinstance(lt, Iterable)) # 判断是否是迭代器 print(isinstance(lt, Iterator))
- iter:可以将可迭代对象转换为迭代器
lt = [1, 2, 3] # 将可迭代对象转换为迭代器 lt2 = iter(lt)
random
-
示例:
import random # 生成指定范围内的随机整数 print(random.randint(1, 10)) # 生成0~1之间的随机小数 print(random.random()) # 生成指定范围内的随机整数,可以指定步幅 print(random.randrange(1, 10, 2)) lt = [1, 2, 3, 4, 5, 6, 7] # 从容器对象或字符串中随机挑选一个元素 print(random.choice(lt)) # print(random.choice('ashdaiapo')) # 从容器对象中随机挑取指定个数的元素 print(random.sample(lt, 3)) # 从容器对象中随机挑取一个元素,sample函数个数为1的情况 print(random.choices(lt)) # 打乱一个列表 random.shuffle(lt) print(lt)
高级函数
-
map
- 参数:
func:一个函数 iter:一个可迭代对象
- 功能:
将可迭代对象遍历,每个元素都使用该函数处理一遍,然后返回,保存这种算法的迭代器
- 使用:
from collections import Iterator lt = [1, 2, 3, 4, 5] def pingfang(n): return n * n # 返回map对象,是一个迭代器 # ret = map(pingfang, lt) ret = map(lambda x: x*x, lt) print(isinstance(ret, Iterator)) print(list(ret)) # print(next(ret)) # print(next(ret))
-
练习:
- 熟悉字符串函数:strip、lstrip、rstrip
- 使用map函数:将一个元素全是字符串的列表进行处理,去掉两边空白,然后首字符大写
-
filter
- 参数
function:一个函数 iterable:可迭代对象
-
功能:
使用function依次作用于可迭代对象中的每个元素,当返回结果为True时保留该元素。返回filter对象,是一个迭代器。
-
示例:
lt = [1, 2, 3, 4, 5] def oushu(n): return n%2 == 0 # 返回filter对象,是一个迭代器 # ret = filter(oushu, lt) ret = filter(lambda x: x%2 != 0, lt) print(ret) print(list(ret)) # print(next(ret))
- 练习:使用filter函数,提取一个任意列表中长度大于3的字符串元素。
-
reduce
- 参数
function:一个函数 sequence:一个序列
- 功能:
- 首先从序列中取出前两个元素,作为function的参数处理一下
- 处理完的结果与下一个元素再使用function处理一下
- 处理结束,将处理完的结果返回
- 示例:
from functools import reduce lt = [1, 2, 3, 4, 5] def add(a, b): return a + b # ret = reduce(add, lt) # ret = reduce(lambda x, y: x*y, lt) ret = reduce(lambda x, y: x*10 + y, lt) print(ret)