函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套
名称空间与作用域
闭包函数
装饰器
迭代器
生成器
三元表达式,列表解析,生成器表达式
递归与二分法
内置函数
--------------------------------------------
函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数
函数的嵌套定义:在一个函数的内部,又定义另外一个函数
def max(x,y):
if x>y:
return x
else:
return y
def max1(a,b,c,d):
res=max(a,b)
res2=max(res,c)
res3=max(res2,d)
return res3
print(max1(4,5,6,7))
效果:7
--------------------------------------------------
名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方

内置名称空间:在python解释器启动时产生,存放一些python内置的名字(存在始终)
全局名称空间:在执行文件时,存放文件级别定义的名字(不用缩进)
局部名称空间:在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间
用来存放该函数内定义的名字,该名字在函数调用时生效,在函数调用结束后失效

加载顺序:内置--》全局--》局部

****名字的查找顺序:局部-全局-内置
------------------------------------------------
作用域:作用的范围
全局作用域:全局存活,全局有效globals()
局部作用域:临时存活,局部有效locals()
(global 值)设置为全局
(nonlocal 值)设置为局部

*作用域关系,在行数定义时就已经固定,于调用位置无关,在调用函数时,必须回到函数原来定义的位置去找作用域关系
============================================================================
闭包函数:定义在函数内部的函数,包含对外部作用域名字的引用,而不是对全局作用域名字的引用

闭包函数的应用:惰性计算
import requests #pip3 install requests
def index(url):
# url=‘https://www.python.org‘
def get():
return requests.get(url).text
return get
python_web=index(‘https://www.python.org‘)
baiduweb=index(‘https://www,baidu.com‘)
python_web()
baiduweb()
-----------------------------------------------------------------------------
装饰器:
1 开放封闭原则:对扩展是开放的,对修改是封闭
2 装饰器:装饰他人的工具,装饰器目的是为其他人添加新功能
装饰器本身可以是任意可调用对象,被装饰的对象本身也可以是任意可调用对象
2.1 装饰器的遵循的原则:1不修改被装饰对象的源代码
2不修改被调用对象的调用方式
2.2 装饰器的目的是:在遵循1和2的前提下,为其他函数添加新功能
import time

def timmer(func):
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)

stop=time.time()
print(‘run time is %s‘ %(stop-start))
return res
return wrapper

@timmer #index=timmer(index)
def index():
time.sleep(3)
print("welcome to index")
return 1234
@timmer #home=timmer(home)

def home(name):
time.sleep(2)
print("dddddd%s" %name)

index()
home(666)
------------------------------------------------------------
迭代:是一个重复的过程,每一次重复,都是基于上一次的结果而来
迭代器:
可迭代的对象:凡是对象下有_iter_方法:对象._iter_,该对象就是可迭代对象
s=‘hello‘
l=[‘a‘,‘b‘,‘c‘,‘d‘]
t=(‘a‘,‘b‘,‘c‘,‘d‘)
dic={‘name‘:‘elroy‘,‘sex‘:‘m‘}
set1={1,2,3}
f=open(‘db.txt‘)
----------------------------------
s.__iter__()
l.__iter__()
t.__iter__()
dic.__iter__()
set1.__iter__()
f.__iter__()
dic={‘name‘:‘elroy‘,‘sex‘:‘m‘}
i=dic.__iter__()
print(i) #iterator迭代器
--------------------------------------------
l=[‘a‘,‘b‘,‘c‘,‘d‘]
dic={‘name‘:‘elroy‘,‘sex‘:‘m‘}
i=iter(l)
iter_dic=iter(dic)
while True:
try:
print(next(i))
k=next(iter_dic)
print(k,dic[k])
except StopIteration:检查报错语句并退出
break
=============================================
什么是迭代器对象:
1 有__iter_,执行得到仍然是迭代本身
2 有__next__

迭代器对象有点:
1 提供了一种统一的(不依赖于索引的)迭代方式
2 迭代器本身,比起其他数据类型更省内存
迭代器对象缺点:
1 一次性,只能往后走,不能回退,不如索引取值灵活
2 无法预知什么时候取值结束,即无法预支长度

*for循环遵循迭代器协议
文件本身就是迭代器对象

判断可迭代对象与迭代器对象
from collections import Iterable,Iterator
s=‘hello‘
l=[‘a‘,‘b‘,‘c‘,‘d‘]
t=(‘a‘,‘b‘,‘c‘,‘d‘)
dic={‘name‘:‘elroy‘,‘sex‘:‘m‘}
set1={1,2,3}
f=open(‘db.txt‘)

print(isinstance(s,Iterable))
print(isinstance(l,Iterable))
print(isinstance(t,Iterable))
print(isinstance(dic,Iterable))
print(isinstance(set1,Iterable))
print(isinstance(f,Iterable))
*文件是迭代器对象 print(isinstance(f,Iterator))
效果:
True
True
True
True
True
True
Ture
-------------------------------------------------
生成器:在函数颞部包含yield关键,那么该函数执行的结果是生成器
生成器就是迭代器
yield的功能: 1 把函数的结果做成迭代器(以一种优雅的方式封装好__iter__,__next__)
2 函数暂停与再继续运行的状态是由yield
无穷尽的值:
def elroy(n):
print("开始")
while True:
yield n
n+=1
g=elroy(0)
for i in g:
print(i)
效果:
开始
450579
450580
450581
450582
450583
450584
450585
450586
450587
450588
450589
450590
450591
450592
450593
450594
450595
450596
---------------------------------------
def my_range(start,stop):
while True:
if start == stop:
* raise StopIteration #终止迭代器异常
yield start
start+=1

for i in my_range(1,3):
print(i)
****for循环自动出来StopIeration退出循环
---------------------------------------------
yield与return的比较?
相同:都有返回值的功能
不同:return只能返回一次值,而yield可以返回多次值
=============================================================
三元表达式,列表解析,生成器表达式
if判断的另外一种表现形式
x=10
def foo():
if x > 3:
return ‘OK‘
else:
return ‘NO‘
print(foo())

x=10
res=‘OK‘ if x>3 else ‘NO‘
print(res)
----------------------------------------
列表解析,生成器表达式(不允许else:)为了多行代码浓缩成少行
l=[]
for i in range(10):
l.append("egg%s" %i)
print(l)

*l=[‘egg%s‘ %i for i in range(10)]
*print(l)
------------
l=[]
for i in range(10):
if i >=5:
l.append("egg%s" %i)

print(l)

l=[‘egg%s‘ %i for i in range(10) if i >=5]
print(l)
效果:
[‘egg5‘, ‘egg6‘, ‘egg7‘, ‘egg8‘, ‘egg9‘]
[‘egg5‘, ‘egg6‘, ‘egg7‘, ‘egg8‘, ‘egg9‘]
-----------------------------------------------
生成器表达式:(占内存大的时候用)

with open(‘a.txt‘,encoding=‘utf-8‘) as f:
res=max((len(line) for line in f))
print(res)
效果:
44
-----------------------------------------------
声明式编程:
文件内容:
asdfaf 11111 1
asdfa 1111112 2
asdf 1111114 3
asd 1111113 4
---------------------
with open(‘d.txt‘,encoding=‘utf-8‘)as f:
l=[]
for line in f:
goods=line.split()
price=float(goods[1])
connt=int(goods[2])
const=price*connt
l.append(const)

print(sum(l))
-------------------------------------------------
简化版本:with open(‘d.txt‘,encoding=‘utf-8‘)as f:
l=[float(line.split()[1])*int(line.split()[2])for line in f]
print(sum(l))

http://www.cnblogs.com/linhaifeng/articles/6883726.html
函数嵌套
名称空间与作用域
闭包函数
装饰器
迭代器
生成器
三元表达式,列表解析,生成器表达式
递归与二分法
内置函数
--------------------------------------------
函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数
函数的嵌套定义:在一个函数的内部,又定义另外一个函数
def max(x,y):
if x>y:
return x
else:
return y
def max1(a,b,c,d):
res=max(a,b)
res2=max(res,c)
res3=max(res2,d)
return res3
print(max1(4,5,6,7))
效果:7
--------------------------------------------------
名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方

内置名称空间:在python解释器启动时产生,存放一些python内置的名字(存在始终)
全局名称空间:在执行文件时,存放文件级别定义的名字(不用缩进)
局部名称空间:在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间
用来存放该函数内定义的名字,该名字在函数调用时生效,在函数调用结束后失效

加载顺序:内置--》全局--》局部

****名字的查找顺序:局部-全局-内置
------------------------------------------------
作用域:作用的范围
全局作用域:全局存活,全局有效globals()
局部作用域:临时存活,局部有效locals()
(global 值)设置为全局
(nonlocal 值)设置为局部

*作用域关系,在行数定义时就已经固定,于调用位置无关,在调用函数时,必须回到函数原来定义的位置去找作用域关系
============================================================================
闭包函数:定义在函数内部的函数,包含对外部作用域名字的引用,而不是对全局作用域名字的引用

闭包函数的应用:惰性计算
import requests #pip3 install requests
def index(url):
# url=‘https://www.python.org‘
def get():
return requests.get(url).text
return get
python_web=index(‘https://www.python.org‘)
baiduweb=index(‘https://www,baidu.com‘)
python_web()
baiduweb()
-----------------------------------------------------------------------------
装饰器:
1 开放封闭原则:对扩展是开放的,对修改是封闭
2 装饰器:装饰他人的工具,装饰器目的是为其他人添加新功能
装饰器本身可以是任意可调用对象,被装饰的对象本身也可以是任意可调用对象
2.1 装饰器的遵循的原则:1不修改被装饰对象的源代码
2不修改被调用对象的调用方式
2.2 装饰器的目的是:在遵循1和2的前提下,为其他函数添加新功能
import time

def timmer(func):
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)

stop=time.time()
print(‘run time is %s‘ %(stop-start))
return res
return wrapper

@timmer #index=timmer(index)
def index():
time.sleep(3)
print("welcome to index")
return 1234
@timmer #home=timmer(home)

def home(name):
time.sleep(2)
print("dddddd%s" %name)

index()
home(666)
------------------------------------------------------------
迭代:是一个重复的过程,每一次重复,都是基于上一次的结果而来
迭代器:
可迭代的对象:凡是对象下有_iter_方法:对象._iter_,该对象就是可迭代对象
s=‘hello‘
l=[‘a‘,‘b‘,‘c‘,‘d‘]
t=(‘a‘,‘b‘,‘c‘,‘d‘)
dic={‘name‘:‘elroy‘,‘sex‘:‘m‘}
set1={1,2,3}
f=open(‘db.txt‘)
----------------------------------
s.__iter__()
l.__iter__()
t.__iter__()
dic.__iter__()
set1.__iter__()
f.__iter__()
dic={‘name‘:‘elroy‘,‘sex‘:‘m‘}
i=dic.__iter__()
print(i) #iterator迭代器
--------------------------------------------
l=[‘a‘,‘b‘,‘c‘,‘d‘]
dic={‘name‘:‘elroy‘,‘sex‘:‘m‘}
i=iter(l)
iter_dic=iter(dic)
while True:
try:
print(next(i))
k=next(iter_dic)
print(k,dic[k])
except StopIteration:检查报错语句并退出
break
=============================================
什么是迭代器对象:
1 有__iter_,执行得到仍然是迭代本身
2 有__next__

迭代器对象有点:
1 提供了一种统一的(不依赖于索引的)迭代方式
2 迭代器本身,比起其他数据类型更省内存
迭代器对象缺点:
1 一次性,只能往后走,不能回退,不如索引取值灵活
2 无法预知什么时候取值结束,即无法预支长度

*for循环遵循迭代器协议
文件本身就是迭代器对象

判断可迭代对象与迭代器对象
from collections import Iterable,Iterator
s=‘hello‘
l=[‘a‘,‘b‘,‘c‘,‘d‘]
t=(‘a‘,‘b‘,‘c‘,‘d‘)
dic={‘name‘:‘elroy‘,‘sex‘:‘m‘}
set1={1,2,3}
f=open(‘db.txt‘)

print(isinstance(s,Iterable))
print(isinstance(l,Iterable))
print(isinstance(t,Iterable))
print(isinstance(dic,Iterable))
print(isinstance(set1,Iterable))
print(isinstance(f,Iterable))
*文件是迭代器对象 print(isinstance(f,Iterator))
效果:
True
True
True
True
True
True
Ture
-------------------------------------------------
生成器:在函数颞部包含yield关键,那么该函数执行的结果是生成器
生成器就是迭代器
yield的功能: 1 把函数的结果做成迭代器(以一种优雅的方式封装好__iter__,__next__)
2 函数暂停与再继续运行的状态是由yield
无穷尽的值:
def elroy(n):
print("开始")
while True:
yield n
n+=1
g=elroy(0)
for i in g:
print(i)
效果:
开始
450579
450580
450581
450582
450583
450584
450585
450586
450587
450588
450589
450590
450591
450592
450593
450594
450595
450596
---------------------------------------
def my_range(start,stop):
while True:
if start == stop:
* raise StopIteration #终止迭代器异常
yield start
start+=1

for i in my_range(1,3):
print(i)
****for循环自动出来StopIeration退出循环
---------------------------------------------
yield与return的比较?
相同:都有返回值的功能
不同:return只能返回一次值,而yield可以返回多次值
=============================================================
三元表达式,列表解析,生成器表达式
if判断的另外一种表现形式
x=10
def foo():
if x > 3:
return ‘OK‘
else:
return ‘NO‘
print(foo())

x=10
res=‘OK‘ if x>3 else ‘NO‘
print(res)
----------------------------------------
列表解析,生成器表达式(不允许else:)为了多行代码浓缩成少行
l=[]
for i in range(10):
l.append("egg%s" %i)
print(l)

*l=[‘egg%s‘ %i for i in range(10)]
*print(l)
------------
l=[]
for i in range(10):
if i >=5:
l.append("egg%s" %i)

print(l)

l=[‘egg%s‘ %i for i in range(10) if i >=5]
print(l)
效果:
[‘egg5‘, ‘egg6‘, ‘egg7‘, ‘egg8‘, ‘egg9‘]
[‘egg5‘, ‘egg6‘, ‘egg7‘, ‘egg8‘, ‘egg9‘]
-----------------------------------------------
生成器表达式:(占内存大的时候用)

with open(‘a.txt‘,encoding=‘utf-8‘) as f:
res=max((len(line) for line in f))
print(res)
效果:
44
-----------------------------------------------
声明式编程:
文件内容:
asdfaf 11111 1
asdfa 1111112 2
asdf 1111114 3
asd 1111113 4
---------------------
with open(‘d.txt‘,encoding=‘utf-8‘)as f:
l=[]
for line in f:
goods=line.split()
price=float(goods[1])
connt=int(goods[2])
const=price*connt
l.append(const)

print(sum(l))
-------------------------------------------------
简化版本:with open(‘d.txt‘,encoding=‘utf-8‘)as f:
l=[float(line.split()[1])*int(line.split()[2])for line in f]
print(sum(l))

时间: 2024-12-18 01:15:47

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数的相关文章

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

函数对象,函数的嵌套,名称空间与作用域,闭包,装饰器,迭代器,内置函数

一,函数对象 函数对象:函数是第一类对象,即函数可以当做数据传递 1,可以被引用 2,可以做参数的传递 3,返回值可以是函数 4,可以当作容器类型的元素 二,函数嵌套 1,函数的嵌套调用 2,函数的嵌套定义 三,名称空间与作用域 名称空间:存放名字的地方叫名称空间,存放这些值与名字的绑定关系 查看内置名称的两种方法: 三种名称空间 1,内置名称空间:随着python解释器的启动而产生 2,全局名称空间:文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间 3,局部名称空间:调用函

函数对象.函数嵌套,名称空间作用域

函数对象 函数使用方法 之前说函数类似于变量,那么有些变量的使用方法在函数上也是适用的 python中一切皆对象,我们可以对它获取内存地址或者打印类型或者其他的操作 1. 引用,赋值 def self_max(x,y): if x > y: return x return y a = self_max #此时a就是函数self_max max_num = a(20,39) print(max_num) 39 2. 当作函数的返回值 def f2(): print('from f2') def f

python学习笔记第五节(函数,名称空间,作用域)

python2中 默认存为unicode需要再字符串前加u 循环打印每一行 循环打印整个文件内容方式二下面这种同一时间取一行 先定义后执行 函数定义的时候,只检测语法错误,不执行 函数返回值,默认是元组模式return 只能返回一次 形参与实参 形参就是变量名实参就是值 打破顺序限制 经常变化的值用位置形参,值通常不变的用默认参数.默认参数通常定义成不可变类型.默认参数只在定义时被赋值一次. 可变长参数就是* 关键字参数(关键字参数指的是实参当中指定y=2,z=3等等) *等同于位置参数 函数内

python 函数的名称空间及作用域

一:名称空间 1:什么是名称空间: 名称空间即:储存名字与值的内存地址关联关系的空间 2.名称空间的分类: 内置名称空间:存储器自带的一些名称与值的对应关系,如:print,len,max等; 生命周期为:在python解释器启动时创建,在解释器关闭时销毁 全局名称空间:除了内置的,函数内的都是在全局名称空间中 生命周期为:在执行文件时,创建全局名称空间,所有文件中的代码全部执行完毕后,销毁名称空间(即解释器关闭时) 局部名称空间:只要在函数内的名称空间就是局部的 生命周期为:调用函数时创建,函

函数的名称空间与作用域

1.名称空间namespaces 存放名字与值绑定关系的地方 2.名称空间分为三大类 内置名称空间: 作用:存放python解释器自带的名字 生命周期: 在解释器启动时生效,在解释器关闭时失效 全局名称空间: 作用:除了内置的与局部的名字外,其余都是全局名字 生命周期: 在文件执行时生效,在文件执行完毕时失效 例如:x,func,y,l,z都是 x=1 def func(): a=1 y=2 l=[1,2] if 3 > 2: if if if z=3 局部名称空间: 作用:用于存放函数调用期间

Python基础第十天——yield的表达式形式的应用、面向过程编程、内置函数

鸡汤: 首先,我一定要怀着一颗感恩的心,感谢这个世界上与我接触的人,不管你们对我是关心.是帮助.是冷漠.甚至是厌恶,我都感谢你们. 因为关心和帮助让我感受到了对爱的希望, 因为冷漠和厌恶让我感悟到了人生的残酷, 让恨的怒气和爱的力量化作一股永生不灭的的动力,使我在这条未知的人生道路上   继续写下新的篇章. --奔跑吧小白 一.yield的表达式形式的应用 send():具有传值和next的效果.先暂停的位置传值,再next生成器 send(None):表示不传值,只有next的效果,相当于直接

python基础(3):函数对象、函数嵌套、名称空间与作用域、装饰器

函数对象 函数嵌套 名称空间与作用域 闭包函数 装饰器 练习 一 函数对象 #1 可以被引用 def max(x, y): return x if x > y else y func = max print(func(1, 2)) #2 可以当作参数传递 def max(x, y): return x if x > y else y def max_1(x, func): return func(x, 1) print(max_1(2, max)) #3 返回值可以是函数 #4 可以当作容器类

python之旅:函数对象、函数嵌套、名称空间与作用域、装饰器

一.函数对象 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 # 利用该特性,优雅的取代多分支的if 二.函数嵌套 三.名称空间与作用域 四丶装饰器 原文地址:https://www.cnblogs.com/moyand/p/8667266.html