day7-基础函数的学习(二)
过了元旦,加油鸭,冲鸭!!!
闲话不说,开始今日份学习整理。
今日目录,今天的学习内容不是很多!
1.函数名的运用
2.闭包(重要)
3.迭代器(重要)
开始今日份总结
1.函数名的运用
1.1函数名是一个特殊的变量
- def func():
- print(666)
- print(func)
- #结果
- <function func at 0x000001C2D44E7F28>
- #返回函数的内存地址
1.2函数名可以当做变量赋值
- def func():
- print(666)
- func2 = func
- f1 = func2
- f2 = f1
- f3 = f2
- print(f3)
- #结果,返回函数的内存空间
- <function func at 0x0000020FA58B7F28>
1.3函数名可以当做容器类数据类型的元素
- def func1():
- print('func1')
- def func2():
- print('func2')
- def func3():
- print('func3')
- li =[func1,func2,func3]
- for i in li:
- i()
- #这样就可以一个一个的去调用函数了
1.4函数名可以当做函数的参数
- def func(x):
- x()
- print('in func')
- def func1():
- print('in func1')
- func(func1)
- #结果
- in func1
- in func
1.5函数名可以当做函数的返回值
- def func(x): # x ---> func1
- return x # func1
- def func1():
- print('in func1')
- ret = func(func1) # func1
- ret()
- #结果
- in func1
2.闭包(重要)
定义:
- 内层函数对于外层函数(非全局)变量的引用
- 闭包值存在于内层函数内
- 函数都要逐层返回,最终返回最外层的函数
- (个人理解)在函数外部可以调用函数内部,同时可以使用内部的值
闭包的确定
- #不是闭包
- name = 'test'
- def func1():
- def inner():
- print(name)
- return inner()
- f = func1()
- print(f.__closure__[0].cell_contents)
- #结果
- AttributeError: 'NoneType' object has no attribute '__closure__'
- #表示函数内没有闭包的参数
- #是闭包
- # 闭包
- def func():
- age =18
- name ='test'
- def inner():
- print(age)
- print(name)
- return inner
- f = func()
- # 获取闭包引用的外层变量
- print(f.__closure__[0].cell_contents)
- print(f.__closure__[1].cell_contents)
- #结果
- 18
- test
闭包的用法
需求,输入一个数,连续自加这个数五次,有可能会写成这样
- def func(step):
- sum = 1
- sum += step
- print(sum)
- i =0
- while i <5:
- func(3)
- i+=1
- #结果
- 4
- 4
- 4
- 4
- 4
闭包:解释器执行程序时,如果遇到函数,随着函数的结束而关闭临时名称空间,但是!!!
如果遇到闭包,有一个机制:那么闭包的空间不会随着函数的结束而关闭。
重新写一下上面这个需求
- def func(step):
- sum1 = 1
- def inner():
- nonlocal sum1
- sum1 += step
- print(sum1)
- return inner
- i =0
- f =func(3)
- while i <5:
- f()
- i+=1
- #结果
- 4
- 7
- 10
- 13
- 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(可迭代对象)
- s1 = 'abcd'
- obj = iter(s1)
- print(obj)
- print(obj.__next__())
- print(obj.__next__())
- print(obj.__next__())
- print(obj.__next__())
- print(obj.__next__())
- # 一个next 对应一个值,一一对应。
- #结果
- a
- b
- c
- d
- print(obj.__next__())
- StopIteration
判断
一个对象是是迭代器
- #方法一:判断一个对象内有没有指定的方法
- li =[1,2,3,4]
- obj = iter(li)
- print('__iter__'in dir(obj) and '__next__'in dir(obj))
- #结果
- True
- #方法二:引入其他模块,进行判断
- from collections import Iterable
- from collections import Iterator
- li =[1,2,3,4]
- obj = iter(li)
- print(isinstance(obj,Iterable))#判断是否是可迭代对象
- print(isinstance(obj,Iterator))#判断是否是迭代器
- #结果
- True
- True
- #这个也可以用于判断上面是否是可迭代对象
type() isinstance()区别?
type()只是判断该对象的数据类型
isinstance()不仅可以判断该对象的数据类型,而且可以判断其他很多
迭代器的作用:
1,节省内存.
2,惰性机制.
3, 一条路走到黑,不走回头路.
s2 = [1, 2, 3, 4, 5]
obj2 = iter(s2)
print(next(obj2))
print(next(obj2))
练习
- # 练习
- # 判断一个对象是否是可迭代对象,迭代器
- # str list tuple set dict range() 文件句柄
- # f = open('file',encoding='utf-8',mode='w')
- # print(isinstance(f,Iterator))
- # s2 = [1, 2, 3]
- # # 将s2转化成迭代器 进行取值
- # obj2 = iter(s2)
- # # print(obj2.__next__())
- # print(next(obj2))
- #while循环模拟for循环机制
day7-基础函数的学习(二)的更多相关文章
- Python学习---基础函数的学习
1.1. 基础函数 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 灌输一个概念:Python中函数就是对象,函数和我们之前的[1,2,3],'abc ...
- php函数每日学习二十个
数学函数 1,abs() 求绝对值 2,ceil() 进一法取整 3,floor() 舍去法取整 4,fmod()对浮点数进行取余 例如fmod(5.7,1.3) 5,pow() 返回数的n次方 po ...
- Android JNI学习(二)——实战JNI之“hello world”
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
- Python入门基础学习 二
Python入门基础学习 二 猜数字小游戏进阶版 修改建议: 猜错的时候程序可以给出提示,告诉用户猜测的数字偏大还是偏小: 没运行一次程序只能猜测一次,应该提供多次机会给用户猜测: 每次运行程序,答案 ...
- Python基础学习二
Python基础学习二 1.编码 utf-8编码:自动将英文保存为1个字符,中文3个字符.ASCll编码被囊括在内. unicode:将所有字符保存为2给字符,容纳了世界上所有的编码. 2.字符串内置 ...
- Go基础学习(二)
数组[array] 数组定义[定义后长度不可变] 12 symbol := [...]string{USD: "$", EUR: "€", GBP: " ...
- php二维数组中的查找(善于利用基础函数)
php二维数组中的查找(善于利用基础函数) 一.总结 真没必要完整的写函数,善于借用 1.array_search()是在以为数组中来找,现在我们要在二维数组数组中来,肯定要借用这个 2.!==fal ...
- 【转载】salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句
salesforce 零基础开发入门学习(二)变量基础知识,集合,表达式,流程控制语句 salesforce如果简单的说可以大概分成两个部分:Apex,VisualForce Page. 其中Apex ...
- 量子计算机编程(二)——QPU基础函数
第二部分主要是QPU的基础功能,第一部分就像是我们有了哪些基本的语句,第二部分就是我们能写一些简单基础的函数,一些小模块,第三部分就是他的应用了. 先来看一下一个简单量子应用的结构: 第一步,将量子态 ...
随机推荐
- iterm2 快捷键(转载)
Mac 下 iterm2 的快捷键,转自:https://github.com/sumiaowen/iterm2-shortcuts iterm2-shortcuts(iterm 2 快捷键) 标签 ...
- centos7忘记root密码
开机时狂点方向键下(Windows还原习惯了),或者狂点别的键.目的为了不让它进入系统. 方向键移动光标定位在第一行,按e编辑它. 在新界面找到linux16开头的行.→光标到 ro 改成rw ...
- 设计模式总结篇系列:原型模式(Prototype)
首先对原型模式进行一个简单概念说明:通过一个已经存在的对象,复制出更多的具有与此对象具有相同类型的新的对象. 在理解Java原型模式之前,首先需要理解Java中的一个概念:复制/克隆. 在博文< ...
- python 中 *args 和 **kwargs 的区别
在 python 中,*args 和 **kwargs 都代表 1个 或 多个 参数的意思.*args 传入tuple 类型的无名参数,而 **kwargs 传入的参数是 dict 类型.下文举例说明 ...
- Java提高班(三)并发中的线程同步与锁
乐观锁.悲观锁.公平锁.自旋锁.偏向锁.轻量级锁.重量级锁.锁膨胀...难理解?不存的!来,话不多说,带你飙车. 上一篇介绍了线程池的使用,在享受线程池带给我们的性能优势之外,似乎也带来了另一个问题: ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(9)- KBOOT特性(IntegrityCheck)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT之完整性检测(Integrity Check)特性. Application完整性检测是非常 ...
- 【测试工程师面试】 记录XX银行面试
LZ在一个18线小城市做测试,近来想走出自己的舒适区,去做一点不一样的测试工作. 18线地区,测试工作并不多.最好的差不多就是LZ目前待着的公司了.遂决定去魔都闯荡几年,对一个在魔都无房无车无户口的人 ...
- GitHub 开源的 MySQL 在线更改 Schema 工具【转】
本文来自:https://segmentfault.com/a/1190000006158503 原文:gh-ost: GitHub's online schema migration tool fo ...
- 百度图片objURL解密vb.net版
Function Baidtu_Uncomplie(k As String) As String Dim c = {"_z2C$q", "_z&e3B" ...
- 【微服务No.2】polly微服务故障处理库
熔断.降级: 熔断:熔断就是我们常说的“保险丝”,意为当服务出现某些状况时,切断服务,从而防止应用程序不断地常识执行可能会失败的操作造成系统的“雪崩”,或者大量的超时等待导致系统卡死等情况,很多地方也 ...