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

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

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

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-基础函数的学习(二)的更多相关文章

  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. Python进阶:迭代器与迭代器切片

    2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇.合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动.原系列的单篇就不删除了,毕竟也是 ...

  2. 文本主题模型之非负矩阵分解(NMF)

    在文本主题模型之潜在语义索引(LSI)中,我们讲到LSI主题模型使用了奇异值分解,面临着高维度计算量太大的问题.这里我们就介绍另一种基于矩阵分解的主题模型:非负矩阵分解(NMF),它同样使用了矩阵分解 ...

  3. 设计模式总结篇系列:代理模式(Proxy)

    时代在发展,我们发现,现在不少明星都开始进行微访谈之类的,有越来越多的参与捐赠等.新的一天开始了,首先看下新的一天的日程安排: interface Schedule{ public void weiT ...

  4. Jenkins结合.net平台综合应用之使用FileZilla搭建ftp服务器

    上一节我们讲解了如何编译web项目,web项生成以后我们是手动复制到iis目录下的,这显然不符合devops初衷,这里我们讲解如何利用ftp协议把文件传到远程服务器的iis目录下. 这一讲分两部分一部 ...

  5. Golang垃圾回收机制(一)

    原文: http://legendtkl.com/2017/04/28/golang-gc/ 1. Golang GC 发展 Golang 从第一个版本以来,GC 一直是大家诟病最多的.但是每一个版本 ...

  6. IOS中armv7,armv7s,arm64以及i386和x86_64讲解

    一.前言问题 在iOS 开发过程中,估计比较少的人会在意armv7,armv7s,arm64这些概念,如果在意可能也是项目中出现了像下面的问题,才会想起来解决这些问题,但还是不是特别的理解,这些概念, ...

  7. C#工具:ASP.NET MVC生成图片验证码

    1.复制下列代码,拷贝到控制器中. #region 生成验证码图片 // [OutputCache(Location = OutputCacheLocation.None, Duration = 0, ...

  8. 经典JS的HTML转义与反转义字符

    //HTML转义 function HTMLEncode(html) { var temp = document.createElement ("div"); (temp.text ...

  9. [转]layui点击左侧导航栏,实现不刷新整个页面,只刷新局部

    本文转自:https://blog.csdn.net/s31415926_004/article/details/84256587 其实这篇文章是给自己看的,以后忘记怎么做回来还能看一下哈哈哈哈哈哈哈 ...

  10. Design Mobile实现国际化

    参考:https://mobile.ant.design/components/locale-provider-cn/