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

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

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

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. Winform 程序打包及安装

    前言 近期被公司外派到驻空调厂的项目组,支援一个TCP相关的程序对接.主要是做智能门禁系统,然后主要是统计出实时的进出人数. 我这边能作为服务端,门禁设备作为客户端,整个流程并不算复杂,根据协议来写, ...

  2. linux下的powerline安装教程

    powerline是一款比较炫酷的状态栏工具,多用于vim和终端命令行.先上两张效果图,然后介绍一下具体的安装教程. 图 1 powerline在shell下的效果图 图 2 powerline在vi ...

  3. 如何解决svn清理失败 不能更新 cleanup失败 cleanup乱码 更新乱码 svn更新提示清理 清理乱码不能清理 svn故障修复SVN cleanup 陷入死循环 svn cleanup时遇到错误怎么办

    平时使用svn的过程中,有的时候由于自己操作故障或者系统原因,导致svn不能更新,提示cleanup也不能成功,陷入了死循环 原因是;svn的数据库队列原因 1,下载sqlite3.exe,googl ...

  4. NiftyNet 数据预处理

    NiftyNet项目介绍 使用NiftyNet时,我们需要先将图像数据和标签进行一次简单的处理,得到对应的.csv文件. 对应文件格式为: img.csv image path img_name im ...

  5. asp.net mvc Html.BeginForm()及Html.Action用法

    Html.BeginForm    Add:操作方法的名称,Activities:控制器的名称,FormMethod.Post:定义from的method的值,,new { id = "fo ...

  6. C# 判断用户是否对路径拥有访问权限

    如何获取当前系统用户对文件/文件夹的操作权限? 1.获取安全信息DirectorySecurity DirectorySecurity fileAcl = Directory.GetAccessCon ...

  7. Java开发笔记(七十四)内存溢出的两种错误

    前面介绍的几种异常,其实都存在这样那样的逻辑问题,属于程序员的编码手误.还有一大类系统错误,表面上看不出什么问题,但是程序仍然运行不下去,兹举二例说明.第一个例子且看下列的测试代码: // 测试内存溢 ...

  8. ASP.NET Core介绍

    认识ASP.NET Core ASP.NET Core是一个跨平台,高性能,开源的框架,用于构建现代,基于云的网络应用程序,使用ASP.NET Core可以实现: 开发web应用,服务,IoT应用和移 ...

  9. Makedown

    目录 Makedown 介绍 Markdown的语法 Makedown 介绍 Makedown的创建者是John Gruber Q:什么是markdown呢? markdown和html类似是mark ...

  10. Dynamics 365新功能:可编辑的网格(行内编辑)

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复238或者20161127可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...