iter的特殊用法以及偏函数partial
iter()的特殊用法
常规使用
iter(obj),会返现一个迭代器,如果 obj 不是可迭代对象,则会报错。
特殊用法(哨兵模式)
iter(object[, sentinel])sentinel 英文翻译为 哨兵。- sentinel 参数是可选的,当它存在时,object 不再传入一个可迭代对象,而是一个可调用对象,通俗点说就是可以通过()调用的对象,而 sentinel 的作用就和它的翻译一样,是一个“哨兵”,当时可调用对象返回值为这个“哨兵”时,循环结束,且不会输出这个“哨兵”。
实例
实例1
心里想一个[1, 10]范围的数,然后代码开始随机,当随机到想的数时停止,看每次代码需要随机几次。
from random import randint
def guess():
return randint(0, 10) num = 1 # 这里先写死心里想的数为5
for i in iter(guess, 5):
print("第%s次猜测,猜测数字为: %s" % (num, i))
num += 1 # 当 guess 返回的是 5 时,会抛出异常 StopIteration,但 for 循环会处理异常,即会结束循环
实例2
构造分块读取数据的生成器
from functools import partial
def chunked_file_reader(file, block_size=1024 * 8):
"""
生成器函数:分块读取文件内容,使用 iter 函数
@param file: 文件句柄
@param block_size: 字节数
@return:
"""
# 首先使用 partial(fp.read, block_size) 构造一个新的无需参数的函数
# 循环将不断返回 fp.read(block_size) 调用结果,直到其为 '' 时终止
for chunk in iter(partial(file.read, block_size), ''):
yield chunk #利用该函数统计含有9的个数
def count_nine_v3(fname):
count = 0
with open(fname) as fp:
for chunk in chunked_file_reader(fp):
count += chunk.count('9')
return count
偏函数functools.partial
概念
- 在Python的functools模块众多的功能中,其中有一个就是偏函数,我们称之为 partial function
- 偏函数,其实是函数的辅佐,可以理解成绑定了一部分参数的函数。作用就是少传参数,更短,更简洁。
partial的组成
- 第一部分也就是第一个参数,是一个函数,这个函数可以是你定义的,也可以是Python内置函数
- 第二部分是一个可变参数,*args
- 第三部分是一个关键字参数
偏函数的使用
偏函数的第二个部分(可变参数),按原有函数的参数顺序进行补充,参数将作用在原函数上,最后偏函数返回一个新函数
实例1
from functools import partial
def mysum(*args,**kwargs):
"""
对传入的位置参数及关键字参数求和
"""
s = 0
print('args',args)
print('kwargs',kwargs)
for i in args:
s += i
for value in kwargs.values():
s += value
return s print(mysum(1,2,3,a=4,b=5)) mysum2 = partial(mysum,3,a=4,b=5,)
print(mysum2(1,2)) >>>args (1, 2, 3)
>>>kwargs {'a': 4, 'b': 5}
>>>15
>>>args (3, 1, 2)
>>>kwargs {'a': 4, 'b': 5}
>>>15
实例2
#选择某一天,然后以这天为准,次日留存,3日留存,7日留存,14日留存,30日留存。
#已有一个获取第几天后的函数
from functools import partial
from datetime import datetime,timedelta
def GetNextDay(baseday,n):
return str((datetime.strptime(str(baseday),'%Y-%m-%d')+timedelta(days=n)).date())
selected_day = '2019-11-11'
print(GetNextDay(selected_day, 1))
print(GetNextDay(selected_day, 2))
print(GetNextDay(selected_day, 6))
print(GetNextDay(selected_day, 13))
print(GetNextDay(selected_day, 29))
#简化
nday = partial(GetNextDay,selected_day)
print('>>>>>>>>>>>>>')
print(nday(1))
print(nday(2))
print(nday(6))
print(nday(13))
print(nday(29))
总结
当函数的参数个数太多,需要简化时,使用 functools.partial 可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
iter的特殊用法以及偏函数partial的更多相关文章
- Scala之偏函数Partial Function
https://blog.csdn.net/bluishglc/article/details/50995939 从使用case语句构造匿名函数谈起在Scala里,我们可以使用case语句来创建一个匿 ...
- python进阶(17)偏函数partial
什么是偏函数partial python中提供一种对于函数固定属性的函数 偏函数的作用 把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数 偏函数的语法 使用偏函数必须先导入from ...
- 装饰器的修复wraps,偏函数partial 以及chain
将被装饰的函数的一些属性值赋值给 装饰器函数,最终让属性的显示更符合我们的直觉. from functools import wraps def wapper(func): @wraps(func) ...
- python中的偏函数partial
Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function).要注意,这里的偏函数和数学意义上的偏函数不一样. 在介绍函数参数的时候,我们讲到,通过 ...
- python的偏函数(partial)
偏函数就是固定原函数的某个参数,比如newadd就是固定了add方法的第一个参数,让a=3,这样对newadd方法只要传入参数B就可以实现add方法了,刚看偏函数的写法可能会不适应,因为partial ...
- python函数编程-偏函数partial function
一般的,通过设定函数参数的默认值,可以减低函数调用的难度.比如:int()函数可以把字符串转换成整数: >>> int(') 123 事实上,int()函数还提供额外的base参数, ...
- python reduce和偏函数partial
functools模块 reduce方法: reduce方法 reduce方法,顾名思义就是减少 可迭代对象不能为空,初始值没提供就在可迭代对象中去一个元素 from functools import ...
- python 中偏函数 partial 的使用
函数的partial应用 函数在执行时,要带上所有必要的参数进行调用.但是,有时参数可以在函数被调用之前提前获知.这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用. 例 ...
- iter 函数另类用法
它可以很简单地构造一个无限迭代器: ): print(i) #将无限打印出0 原来,如果iter有第二个参数,那么第一个参数必须是一个参数可以省略的可调用对象.int函数符合这种要求. 迭代什么时候停 ...
随机推荐
- Linux命令-文件管理(三)
Linux more命令 Linux more 命令类似 cat ,不过会以一页一页的形式显示,更方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(bac ...
- AcWing:108. 奇数码问题(归并排序 + 逆序数)
你一定玩过八数码游戏,它实际上是在一个3×3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3×3的网格中. 例如: 5 2 8 1 3 _ 4 6 7 在游戏过程中,可以把空格与其上 ...
- MDK Keil 5软件小技巧
几乎所有玩ARM Cortex M单片机的坛友都是通过MDK Keil 5或者IAR环境进行单片机的程序开发的,俗话说工欲善其事必先利其器,我们天天都在用这个开发环境,那么,有些在MDK Keil 5 ...
- [CSP-S模拟测试]:停不下来的团长奥尔加(DP)
题目传送门(内部题125) 输入格式 第一行一个整数$n$,含义同题中所述. 第二行$n$个整数,第$i$个数表示$p_i$,含义同题中所述. 输出格式 一行一个整数,表示答案对$1000000007 ...
- Dynamic Web Module 2.3 change to 3.0 maven工程解决办法
pom.xml <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <a ...
- Div内容居中
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 第六周学习总结&java实验报告四
第六周学习总结&java实验报告四 学习总结: 上一周因为接近国庆假期,所以老师没有讲太多的新知识点,只要是带我们一起做了一个动物模拟变声器的实验,进一步了解和学习到继承的 有关知识点和应用: ...
- scrum例会报告+燃尽图02
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9955 一.小组情况 组长:贺敬文组员:彭思雨 王志文 位军营 徐丽君队名 ...
- configprase模块,配置文件模块
import configparser # config = configparser.ConfigParser() # config["DEFAULT"] = {'Port':3 ...
- day8_文件操作及编码解码
一.文件操作基本流程 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所 ...