1、函数嵌套

1、1函数嵌套定义 :在一个函数的内部,又定义另外一个函数。

def f1():
    x=1
    def f2():
        print('from f2')
    f2()
f1()

1、2函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数。

def bar():

print('from bar')

def foo():
    print('from foo')
    bar()
foo()

通过函数的嵌套使用,分解成操作减少重复代码,一次调用。

2、名称空间与作用域

名称空间

2、1 名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方

2、2内置名称空间:python自带的名字,在python解释器启动时产生,存放一些python内置的名字

2、3全局名称空间:在执行文件时,存放文件级别定义的名字,Python中顶行写的。

2、4局部名称空间:在执行文件的过程中,如果调用了函数,则会产生该函数的名称空间,用来存放该函数内定义的名字,该名字在函数调用时生效,调用结束后失效

2、5加载顺序:内置名称空间------>全局名称空间----->局部名称空间

2、6名字的查找顺序:局部名称空间------>全局名称空间----->内置名称空间

作用域,作用的范围

全局作用域:全局存活,全局有效
局部作用域:局部存活,局部有效

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

def f1():

x
= 1

y
= 2

print(locals())

print(globals())

f1()

print(locals())

print(globals())

print(locals() is globals())

修改全局变量的值

x=1

def f1():

global x

x=2

f1()

print(x)

修改局部变量的值

x = 0
def f1():
    x = 1
    def f2():
        x = 2
        def f3():
            nonlocal x  #改的是函数正上方的值
            x = 3
        f3()
    f2()
f1()

优先掌握:作用域关系,在函数定义时就已经固定
,于调用位置无关,在调用函数时,必须回到函数原来定义的位置去找作用域关系.

x = 1

def f1():

def f2():

print(x)

return f2 x = 1

def f1():

def f2():

print(x)

return f2

func = f1()

func()

func = f1()

func()

查看作用域:globals(),locals()

global

nonlocal

LEGB 代表名字查找顺序: locals -> enclosing function
-> globals -> __builtins__

locals 是函数内的名字空间,包括局部变量和形参

enclosing 外部嵌套函数的名字空间(闭包中常见)

globals 全局变量,函数定义所在模块的名字空间

builtins 内置模块的名字空间

3、闭包函数

3、1 闭包函数:
定义在函数内部的函数

3、2包含对外部作用域名字的引用,而不是对全局作用域名字的引用,那么该内部函数就称为闭包函数

import requests

def
deco(url):

def wrapper():

return (requests.get(url).text)

return wrapper

get =
deco('https://www.baidu.com')

print(get())

闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域

4、装饰器

开放封闭原则:对拓展是开放的,对修改是封闭的

装饰器:装饰他人的工具,装饰的目的是为他人添加新功能

装饰器本身是任意可调用对象,被装饰的对象本身也可以是任意可调用的对象

装饰器遵循的原则:1、不修改被装饰对象的源代码

         2、不修改被调用对象的调用方式

装饰器的目的:在遵循1和2原则的前提下,为其他函数添加新功能

@装饰器名:必须写在被装饰对象的正上方,且是单独一行

示例:

import time

def timmer(func):

def wrapper(*args,**kwargs):

start_time=time.time()

res=func(*args,**kwargs)

stop_time=time.time()

print('run time is %s'
%(stop_time-start_time))

return res

return wrapper

@timmer

def foo():

time.sleep(3)

print('from foo')

foo()

装饰器语法:

被装饰函数的正上方,单独一行

@deco1

@deco2

@deco3

def foo():

pass

foo=deco1(deco2(deco3(foo)))

装饰器补充:wraps

from functools import wraps

def deco(func):

@wraps(func) #加在最内层函数正上方

def wrapper(*args,**kwargs):

return func(*args,**kwargs)

return wrapper

@deco

def index():

'''去你妹的'''

print('from index')

print(index.__doc__)

5、迭代器

迭代器:是一个重复的过程,每一次重复,都是基于上一次的结果而来。

s='hello'

l=['a','b','c','d']

t=('a','b','c','d')

dic={'name':'egon','sex':'m',"age":18}

set1={1,2,3}

f=open('db.txt')

迭代器对象本身也是可迭代对象

l=['a','b','c','d']

dic={'name':'egon','sex':'m',"age":18}

iter_l=iter(l)

iter_dic=iter(dic)

while True:

try:

k=next(iter_dic)

print(k,dic[k])

except StopIteration:

break

可迭代对象:

1 有__iter__,执行得到仍然是迭代本身

2 有__next__

迭代器对象的优点

1、提供了一种统一的(不依赖于索引的)迭代方式

2、迭代器本身,比起其他数据类型更省内存

迭代器对象的缺点

1、一次性,只能往后走,不能回退,不如索引取值灵活

2、无法预知什么时候取值结束,即无法预知长度

判断可迭代对象与迭代器对象

print(isinstance(s,Iterable))    判断s数据类型是否是可迭代对象

print(isinstance(s,Iterator))    只有文件是迭代器对象

6、生成器

生成器:

在函数内部包含yield关键字,那么该函数执行的结果就是生成器(生成器就是迭代器)

def
func():

print('first')

yield 11111111

print('second')

yield 2222222

print('third')

yield 33333333

print('fourth')

g=func()

print(g)

from
collections import Iterator

print(isinstance(g,Iterator))

yield的功能:

1 把函数的结果做生迭代器(以一种优雅的方式封装好__iter__,__next__)

2 函数暂停与再继续运行的状态是由yield,保存当前运行状态。

def func(n):

while True:

yield n

n+=1

g=func(0)

print(next(g))

def my_range(start,stop):

while True:

if start == stop:

raise StopIteration

else:

yield start

start+=1

g=my_range(1,3)

for i in my_range(1,3):

print(i)

yield与return的比较?

相同:都有返回值的功能

不同:return只能返回一次值,而yield可以返回多次值

import time

def tail(filepath):

with open(filepath, 'r') as f:

f.seek(0, 2)

while True:

line = f.readline()

if line:

yield line

else:

time.sleep(0.2)

def grep(pattern,lines):

for line in lines:

if pattern in line:

print(line,end='')

grep('error',tail('access.log'))

7、三元表达式,列表推导式,生成器表达式

三元表达式

x=10

res=x if x > 3 else 'no'

print(res)

列表解析

l = ['egg%s'%i for i in range(10)]

l=['egg%s' %i for i in range(10)  if i >=5]

print(l)

names =
['alex_sb','egon','wupeiqi_sb','yuanhao_sb']

names_new = [name for name in names if
name.endswith('sb')]

print(names_new)

生成器表达式

g = ('egg%s'%i for i in range(10))  # 将中括号变成小括号即为生成器表达式

# 迭代器同一时间在内存中只有一个值

print(g)

print(next(g))

print(next(g))

with open('a.txt',encoding='utf-8') as f:

g=(len(line) for line in f)

print(max(g))

python3 函数 二的更多相关文章

  1. python3笔记二十二:正则表达式之函数

    一:学习内容 re.match函数 re.search函数 re.findall函数 二:re.match函数 需要导入包:import re 1.格式:match(pattern,string,fl ...

  2. python3笔记二十三:正则表达式之其他函数

    一:学习内容 re.split函数 re.finditer函数 re.sub函数 group()分组 re.compile函数 二:字符串切割---re.split函数 需要导入包:import re ...

  3. python3函数

    一.python3函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.可以自己创建函数,这被叫做用户自定义函数. 1.定义函数规则 函 ...

  4. python3 基础二——基本的数据类型二

    一.数字(Number) 1.Python支持三种不同的数值类型:整型(int),浮点型(float),复数(complex) 2.Python数字数据类型用于存储数值 3.数据类型是不允许改变的,这 ...

  5. python3 函数注意要点

    一.定义一个函数: def test(): #用def关键词开头 print('*****') def test2(a,b): #a,b为形参 print(a,b) return a,b # retu ...

  6. python之内置函数(二)与匿名函数、递归函数初识

    一.内置函数(二)1.和数据结构相关(24)列表和元祖(2)list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素).tuple:将一个可迭代对象转化成元组(如果是字典,默认将k ...

  7. c/c++ 图相关的函数(二维数组法)

    c/c++ 图相关的函数(二维数组法) 遍历图 插入顶点 添加顶点间的线 删除顶点 删除顶点间的线 摧毁图 取得与v顶点有连线的第一个顶点 取得与v1顶点,v1顶点之后的v2顶点的之后的有连线的第一个 ...

  8. python---day14( 内置函数二)

    内置函数二一:匿名函数 lambda函数 lambda 表示匿名函数,不需要用def 来申明. 语法: 函数名=lambda 参数:返回值 ----〉 案例:f=lambda n:n*n 例子01: ...

  9. 一款多功能的移动端滚动选择器,支持单选到多选、支持多级级联、提供自定义回调函数、提供update函数二次渲染、重定位函数、兼容pc端拖拽等等..

    https://github.com/onlyhom/mobileSelect.js/blob/master/docs/README-CN.md mobileSelect.js 一款多功能的移动端滚动 ...

随机推荐

  1. 使用UIDatePicker

    什么是UIDatePicker 用官方文档的话来说,UIDatePicker就是使用多个滚轮来选择日期和时间的类.官方的示例有定时器,闹钟(设置时间)部件.正确设置后,UIDatePicker对象会在 ...

  2. 了解.net mvc实现原理ActionResult/View

    了解.net mvc实现原理ActionResult/View 上一篇了解了请求至Controller的Action过程,这篇继续看源码处理Action收到请求数据再返回ActionResult到Vi ...

  3. create table #temptable 临时表 和 declare @bianliang table ()表变量

    create table #temptable 临时表 和 declare @bianliang table ()表变量 在开发过程中,经常会遇到使用表变量和本地临时表的情况.下面是对二者的一个介绍: ...

  4. 在Java中怎样高效的推断数组中是否包括某个元素

    来自 http://www.hollischuang.com/archives/1269? 怎样检查一个数组(无序)是否包括一个特定的值?这是一个在Java中经经常使用到的并且非常实用的操作.同一时候 ...

  5. PHP设置会话(Session)超时过期时间实现登录时间限制

    最近某个PHP项目用到了限制登录时间的功能,比如用户登录系统60分钟后如果没有操作就自动退出,我搜索了网络收集了有以下方法可供参考. 第一种方法即设置php.ini配置文件,设置session.gc_ ...

  6. Junit的各种断言

    JUnit为我们提供了一些辅助函数,他们用来帮助我们确定被测试的方法是否按照预期的效果正常工作,通常,把这些辅助函数称为断言.下面我们来介绍一下JUnit的各种断言. 1.assertEquals 函 ...

  7. 【elasticsearch】安装合集

    [elasticsearch](1)centos7 使用yum安装elasticsearch 2.X [elasticsearch](2)centos7 超简单安装elasticsearch 的监控. ...

  8. ipmi 最新和MegaCli 监控磁盘和raid信息

    集群监控之 —— ipmi操作指南 原创 2010年03月23日 16:45:00 标签: 集群 / 服务器 / command / callback / user / interface 12224 ...

  9. Java并发专题 带返回结果的批量任务执行

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/27250059 一般情况下,我们使用Runnable作为基本的任务表示形式,但是R ...

  10. [原]Nginx+Lua服务端合并静态文件

    http://homeway.me 0x01.About 源代码已经上传到github:https://github.com/grasses/nginx-lua-static-merger nginx ...