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的更多相关文章

  1. Scala之偏函数Partial Function

    https://blog.csdn.net/bluishglc/article/details/50995939 从使用case语句构造匿名函数谈起在Scala里,我们可以使用case语句来创建一个匿 ...

  2. python进阶(17)偏函数partial

    什么是偏函数partial python中提供一种对于函数固定属性的函数 偏函数的作用 把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数 偏函数的语法 使用偏函数必须先导入from ...

  3. 装饰器的修复wraps,偏函数partial 以及chain

    将被装饰的函数的一些属性值赋值给 装饰器函数,最终让属性的显示更符合我们的直觉. from functools import wraps def wapper(func): @wraps(func) ...

  4. python中的偏函数partial

    Python的functools模块提供了很多有用的功能,其中一个就是偏函数(Partial function).要注意,这里的偏函数和数学意义上的偏函数不一样. 在介绍函数参数的时候,我们讲到,通过 ...

  5. python的偏函数(partial)

    偏函数就是固定原函数的某个参数,比如newadd就是固定了add方法的第一个参数,让a=3,这样对newadd方法只要传入参数B就可以实现add方法了,刚看偏函数的写法可能会不适应,因为partial ...

  6. python函数编程-偏函数partial function

    一般的,通过设定函数参数的默认值,可以减低函数调用的难度.比如:int()函数可以把字符串转换成整数: >>> int(') 123 事实上,int()函数还提供额外的base参数, ...

  7. python reduce和偏函数partial

    functools模块 reduce方法: reduce方法 reduce方法,顾名思义就是减少 可迭代对象不能为空,初始值没提供就在可迭代对象中去一个元素 from functools import ...

  8. python 中偏函数 partial 的使用

    函数的partial应用 函数在执行时,要带上所有必要的参数进行调用.但是,有时参数可以在函数被调用之前提前获知.这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用. 例 ...

  9. iter 函数另类用法

    它可以很简单地构造一个无限迭代器: ): print(i) #将无限打印出0 原来,如果iter有第二个参数,那么第一个参数必须是一个参数可以省略的可调用对象.int函数符合这种要求. 迭代什么时候停 ...

随机推荐

  1. hexo的流程

    1.基于node 的npm包管理工具2.npm install -g hexo(hexo-cli)3.下载的资源是国外的可能比较慢,可以使用淘宝镜像(代理的仓库)npm install -g hexo ...

  2. Java Optional orElse() 和 orElseGet() Optional.flatMap()和Optional.map()区别

    Java Optional 的 orElse() 和 orElseGet() 的区别 1. 接收的参数不同 orElse()方法以一个自定义类型的数据作为参数 public T orElse(T t) ...

  3. avue你繁琐的表格、表单、树等组件开发的解脱工具,了解一下?

    简介 Avue是基于Vue.js和element的快速开发框架 它的核心是数据驱动UI的思想,让我们从繁琐的crud开发中解脱出来,它的写法类似easyUI,但是写起来比easyui更容易,因为它是基 ...

  4. 第六周总结 & 实验报告(四)

    第六周小结 一.instanceof关键字         在Java中使用instanceof关键字判断一个对象到底是哪个类的实例,返回boolean类型 1.instanceof关键字的作用 例c ...

  5. Promise 的使用

    Promise 的使用,用于异步处理 ,以及解决地狱回调的: 1.  Promise 是一个构造函数,既然是构造函数,我们就可以 new Promise() 就可以得到一个 Promise 的实例 2 ...

  6. 浅谈2-SAT

    引入: 相信大家都了解过差分约束系统.差分约束系统的大体意思就是给出一些有某种关系的变量,问你是否有某种赋值使得这些关系全部成立 其实\(2-SAT\)的题目描述和这个很像(虽然解法不一样) 那么\( ...

  7. Gradle 依赖

    在开发中,我们经常使用compile,api,implementation引入库,这三种是有区别的. 1 api和compile api和compile关键字作用效果是一样的,使用时可以互相替换. 实 ...

  8. Linux 查找当前目录下 包含特定字符串 的所有文件

    使用 Linux 经常会遇到这种情况:只知道文件中包含某些特定的字符串,但是不知道具体的文件名.需要根据“特定的字符串”反向查找文件. 示例(路径文件如下): ./miracle/luna/a.txt ...

  9. Kubernetes Controller执行框架解析

    毫无疑问,声明式API以及Controller机制是Kubernetes设计理念的基础.Controller不断从API Server同步资源对象的期望状态并且在资源对象的期望状态和实际运行状态之间进 ...

  10. PHP 异步执行方式

    在工作中我们经常遇到一些比较耗时的任务,比如用户注册发送邮件,审核短信通知等功能,同步执行这些功能的话,响应时间就会变长,所以一般我们会用队列去管理这些功能,但是如果条件不允许怎么办,今天get了一个 ...