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

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

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

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. Chapter 5 Blood Type——10

    "What?" “什么?” "Your boyfriend seems to think I'm being unpleasant to you — he's debat ...

  2. 精读《正则 ES2018》

    1. 引言 本周精读的文章是 regexp-features-regular-expressions. 这篇文章介绍了 ES2018 正则支持的几个重要特性: Lookbehind assertion ...

  3. centos6.5-vsftp搭建

    我的机子是默认是没有的vsftp. yum install -y vsftp 创建账户专为ftp而生.useradd ftp01 更改账户不可登录系统.usermod -s /sbin/nologin ...

  4. .NET快速信息化系统开发框架 V3.2 -> WinForm“组织机构管理”界面组织机构权限管理采用新的界面,操作权限按模块进行展示

    对于某些大型的企业.信息系统,涉及的组织机构较多,模块多.操作权限也多,对用户或角色一一设置模块.操作权限等比较繁琐.我们可以直接对某一组织机构进行权限的设置,这样设置后,同一组织机构的用户就可以拥有 ...

  5. 【面试】我是如何面试别人List相关知识的,深度有点长文

  6. Python四步实现决策树ID3算法,参考机器学习实战

    一.编写计算历史数据的经验熵函数 from math import log def calcShannonEnt(dataSet): numEntries = len(dataSet) labelCo ...

  7. Python迭代和解析(2):迭代初探

    解析.迭代和生成系列文章:https://www.cnblogs.com/f-ck-need-u/p/9832640.html 在Python中支持两种循环格式:while和for.这两种循环的类型不 ...

  8. [Go] golang结构体成员与函数类型

    package main import ( "fmt" ) //定义一个类型 type tsh struct { //定义成员,类型是func() string test func ...

  9. C#添加PDF页眉——添加文本、图片到页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  10. CSS 渐变色

    CSS linear-gradient() 函数 http://www.runoob.com/cssref/func-linear-gradient.html CSS radial-gradient( ...