过了元旦,加油鸭,冲鸭!!!

闲话不说,开始今日份学习整理。

今日目录,今天的学习内容不是很多!

1.函数名的运用

2.闭包(重要)

3.迭代器(重要)

开始今日份总结

1.函数名的运用

1.1函数名是一个特殊的变量

  1. def func():
  2. print(666)
  3. print(func)
  4. #结果
  5. <function func at 0x000001C2D44E7F28>
  6. #返回函数的内存地址

1.2函数名可以当做变量赋值

  1. def func():
  2. print(666)
  3.  
  4. func2 = func
  5. f1 = func2
  6. f2 = f1
  7. f3 = f2
  8. print(f3)
  9. #结果,返回函数的内存空间
  10. <function func at 0x0000020FA58B7F28>

1.3函数名可以当做容器类数据类型的元素

  1. def func1():
  2. print('func1')
  3.  
  4. def func2():
  5. print('func2')
  6.  
  7. def func3():
  8. print('func3')
  9.  
  10. li =[func1,func2,func3]
  11. for i in li:
  12. i()
  13. #这样就可以一个一个的去调用函数了

1.4函数名可以当做函数的参数

  1. def func(x):
  2. x()
  3. print('in func')
  4.  
  5. def func1():
  6. print('in func1')
  7.  
  8. func(func1)
  9. #结果
  10. in func1
  11. in func

1.5函数名可以当做函数的返回值

  1. def func(x): # x ---> func1
  2. return x # func1
  3.  
  4. def func1():
  5. print('in func1')
  6.  
  7. ret = func(func1) # func1
  8. ret()
  9. #结果
  10. in func1

2.闭包(重要)

定义:

  • 内层函数对于外层函数(非全局)变量的引用
  • 闭包值存在于内层函数内
  • 函数都要逐层返回,最终返回最外层的函数
  • (个人理解)在函数外部可以调用函数内部,同时可以使用内部的值

闭包的确定

  1. #不是闭包
  2. name = 'test'
  3. def func1():
  4. def inner():
  5. print(name)
  6. return inner()
  7.  
  8. f = func1()
  9. print(f.__closure__[0].cell_contents)
  10.  
  11. #结果
  12. AttributeError: 'NoneType' object has no attribute '__closure__'
  13. #表示函数内没有闭包的参数
  14.  
  15. #是闭包
  16. # 闭包
  17. def func():
  18. age =18
  19. name ='test'
  20. def inner():
  21. print(age)
  22. print(name)
  23. return inner
  24. f = func()
  25.  
  26. # 获取闭包引用的外层变量
  27. print(f.__closure__[0].cell_contents)
  28. print(f.__closure__[1].cell_contents)
  29. #结果
  30. 18
  31. test

闭包的用法

需求,输入一个数,连续自加这个数五次,有可能会写成这样

  1. def func(step):
  2. sum = 1
  3. sum += step
  4. print(sum)
  5. i =0
  6. while i <5:
  7. func(3)
  8. i+=1
  9. #结果
  10. 4
  11. 4
  12. 4
  13. 4
  14. 4

闭包:解释器执行程序时,如果遇到函数,随着函数的结束而关闭临时名称空间,但是!!!
            如果遇到闭包,有一个机制:那么闭包的空间不会随着函数的结束而关闭。

重新写一下上面这个需求

  1. def func(step):
  2. sum1 = 1
  3. def inner():
  4. nonlocal sum1
  5. sum1 += step
  6. print(sum1)
  7. return inner
  8. i =0
  9. f =func(3)
  10. while i <5:
  11. f()
  12. i+=1
  13. #结果
  14. 4
  15. 7
  16. 10
  17. 13
  18. 16

需要注意的是,如果将f =func(3)放入下面循环内部,就会发现打印的都是4,原因呢,就是生产了五个闭包,每个闭包执行了一次。

闭包的常用使用环境

  • 装饰器
  • 爬虫的一些使用环境(对一个网页重复抓取,之前抓取的内容已经放在内存中)

3.迭代器(重要)

3.1可迭代对象

常用可迭代对象为:str  list tuple set range() 文件句柄

可迭代对象:内部含有__iter__方法的就是可迭代对象,遵循可迭代协议,可迭代对象不能直接取值

判断是否是可迭代对象

# 方法一:

s1 = 'barry'
# print('__iter__' in dir(s1))
# print('__iter__' in dir(range(10)))

3.2迭代器

迭代器:内部含有'__iter__'并且含有'__next__'方法的就是迭代器,遵循迭代器协议。

可迭代对象转化成迭代器

可迭代对象.__iter__() 或者 iter(可迭代对象)

  1. s1 = 'abcd'
  2. obj = iter(s1)
  3. print(obj)
  4. print(obj.__next__())
  5. print(obj.__next__())
  6. print(obj.__next__())
  7. print(obj.__next__())
  8. print(obj.__next__())
  9. # 一个next 对应一个值,一一对应。
  10. #结果
  11. a
  12. b
  13. c
  14. d
  15. print(obj.__next__())
  16. StopIteration

判断

一个对象是是迭代器

  1. #方法一:判断一个对象内有没有指定的方法
  2. li =[1,2,3,4]
  3. obj = iter(li)
  4. print('__iter__'in dir(obj) and '__next__'in dir(obj))
  5. #结果
  6. True
  7. #方法二:引入其他模块,进行判断
  8. from collections import Iterable
  9. from collections import Iterator
  10. li =[1,2,3,4]
  11. obj = iter(li)
  12. print(isinstance(obj,Iterable))#判断是否是可迭代对象
  13. print(isinstance(obj,Iterator))#判断是否是迭代器
  14. #结果
  15. True
  16. True
  17. #这个也可以用于判断上面是否是可迭代对象

type() isinstance()区别?
type()只是判断该对象的数据类型
isinstance()不仅可以判断该对象的数据类型,而且可以判断其他很多

迭代器的作用:
1,节省内存.
2,惰性机制.
3, 一条路走到黑,不走回头路.
s2 = [1, 2, 3, 4, 5]
obj2 = iter(s2)
print(next(obj2))
print(next(obj2))

练习

  1. # 练习
  2. # 判断一个对象是否是可迭代对象,迭代器
  3. # str list tuple set dict range() 文件句柄
  4. # f = open('file',encoding='utf-8',mode='w')
  5. # print(isinstance(f,Iterator))
  6.  
  7. # s2 = [1, 2, 3]
  8. # # 将s2转化成迭代器 进行取值
  9. # obj2 = iter(s2)
  10. # # print(obj2.__next__())
  11. # print(next(obj2))
  12.  
  13. #while循环模拟for循环机制

day7-基础函数的学习(二)的更多相关文章

  1. Python学习---基础函数的学习

    1.1. 基础函数 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 灌输一个概念:Python中函数就是对象,函数和我们之前的[1,2,3],'abc ...

  2. php函数每日学习二十个

    数学函数 1,abs() 求绝对值 2,ceil() 进一法取整 3,floor() 舍去法取整 4,fmod()对浮点数进行取余 例如fmod(5.7,1.3) 5,pow() 返回数的n次方 po ...

  3. Android JNI学习(二)——实战JNI之“hello world”

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  4. Python学习二:词典基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...

  5. Python入门基础学习 二

    Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...

  6. Python基础学习二

    Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...

  7. Go基础学习(二)

    数组[array] 数组定义[定义后长度不可变] 12 symbol := [...]string{USD: "$", EUR: "€", GBP: " ...

  8. php二维数组中的查找(善于利用基础函数)

    php二维数组中的查找(善于利用基础函数) 一.总结 真没必要完整的写函数,善于借用 1.array_search()是在以为数组中来找,现在我们要在二维数组数组中来,肯定要借用这个 2.!==fal ...

  9. 【转载】salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句

    salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句 salesforce如果简单的说可以大概分成两个部分:Apex,VisualForce Page. 其中Apex ...

  10. 量子计算机编程(二)——QPU基础函数

    第二部分主要是QPU的基础功能,第一部分就像是我们有了哪些基本的语句,第二部分就是我们能写一些简单基础的函数,一些小模块,第三部分就是他的应用了. 先来看一下一个简单量子应用的结构: 第一步,将量子态 ...

随机推荐

  1. iterm2 快捷键(转载)

    Mac 下 iterm2 的快捷键,转自:https://github.com/sumiaowen/iterm2-shortcuts iterm2-shortcuts(iterm 2 快捷键) 标签 ...

  2. centos7忘记root密码

    开机时狂点方向键下(Windows还原习惯了),或者狂点别的键.目的为了不让它进入系统. 方向键移动光标定位在第一行,按e编辑它. 在新界面找到linux16开头的行.→光标到  ro    改成rw ...

  3. 设计模式总结篇系列:原型模式(Prototype)

    首先对原型模式进行一个简单概念说明:通过一个已经存在的对象,复制出更多的具有与此对象具有相同类型的新的对象. 在理解Java原型模式之前,首先需要理解Java中的一个概念:复制/克隆. 在博文< ...

  4. python 中 *args 和 **kwargs 的区别

    在 python 中,*args 和 **kwargs 都代表 1个 或 多个 参数的意思.*args 传入tuple 类型的无名参数,而 **kwargs 传入的参数是 dict 类型.下文举例说明 ...

  5. Java提高班(三)并发中的线程同步与锁

    乐观锁.悲观锁.公平锁.自旋锁.偏向锁.轻量级锁.重量级锁.锁膨胀...难理解?不存的!来,话不多说,带你飙车. 上一篇介绍了线程池的使用,在享受线程池带给我们的性能优势之外,似乎也带来了另一个问题: ...

  6. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(9)- KBOOT特性(IntegrityCheck)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT之完整性检测(Integrity Check)特性. Application完整性检测是非常 ...

  7. 【测试工程师面试】 记录XX银行面试

    LZ在一个18线小城市做测试,近来想走出自己的舒适区,去做一点不一样的测试工作. 18线地区,测试工作并不多.最好的差不多就是LZ目前待着的公司了.遂决定去魔都闯荡几年,对一个在魔都无房无车无户口的人 ...

  8. GitHub 开源的 MySQL 在线更改 Schema 工具【转】

    本文来自:https://segmentfault.com/a/1190000006158503 原文:gh-ost: GitHub's online schema migration tool fo ...

  9. 百度图片objURL解密vb.net版

    Function Baidtu_Uncomplie(k As String) As String Dim c = {"_z2C$q", "_z&e3B" ...

  10. 【微服务No.2】polly微服务故障处理库

    熔断.降级: 熔断:熔断就是我们常说的“保险丝”,意为当服务出现某些状况时,切断服务,从而防止应用程序不断地常识执行可能会失败的操作造成系统的“雪崩”,或者大量的超时等待导致系统卡死等情况,很多地方也 ...