python之函数的进阶
1.名称空间:
定义:用来存放名字的(变量,函数名,类名,引入的模块名)
分类:
内置名称空间:python解释器提供好的一些内置内容
全局名称空间:py文件中自己写的变量
局部名称空间:执行函数时会产生一个局部名称空间,放的是函数内部的内容
2.作用域:
1.全局作用域:内置 + 全局
2.局部作用域: 局部
范围; 内置范围 > 全局 > 局部
全局不能找局部的变量 局部的变量可以找全局的变量
3.locals和globals
locals() :查看当前作用域里面的内容 print(locals())
globals() :查看全局作用域里面的内容 print(globals())
示例
def print():
pass
def func():
a = 10
print(a)
#输出结果是空 :因为第一行print将内置的print改为全局的print,导致在再次调用的时候只会使用全局的print不会使用内置的print
4.关键字 global和nonlocal
4.1 globale 表示从全局把一个变量(比如a)引入局部,后面的变量全是此变量a
使用方法: globale 变量名
# 全局变量一般是不能随意的修改的
# a = 10
# def func():
# # 慎用.
# global a # global 表示从全局把一个变量引入到局部, 后面使用的a都是全局变量
# a += 10 # a = a + 10 # 现在的a是全局的, 你现在视图改全局变量
# print("里面的打印",a) #20
# func()
# print("外面的打印", a) #20
4.2 nonlocal 在局部寻找离他最近的外层的一个变量
使用方法: nonlocal 变量名
a = 50
def func1():
a = 10 # 局部
def func2():
nonlocal a # 不找全局, global找全局
a += 10
print("func2", a) #20
func2()
print(a) #20
func1()
print(a) #50
使用global模拟登陆
flag = False def login():
global flag
uname = input('输入用户名')
upwd= input('输入密码')
if uname == '李雷'and upwd =='韩梅梅':
flag =True
else:
flag = False def fatie():
if flag =True:
print('可以发帖')
else:
print('去登陆') login()
fatie()
5.闭包
1.内层函数对外层函数的应用
2.闭包的优点
1.可以保护变量不被其他人侵害
2.保持一个变量常驻内存
def wrapper():
name = "韩梅梅" # 局部变量常驻与内存
def inner():
print(name) # 在内层函数中使用了外层函数的局部变量
return inner # 返回函数名 ret = wrapper() # ret是一个内层函数
ret() # ret是inner, 执行的时机是不确定的, 必须保证里面的name必须存在
3.__closure__查看是否是闭包. 有内容就是闭包, 没有内容就不是闭包
def wrapper():
name = "韩梅梅"
def inner():
print(name)
print(inner.__closure__) # 查看是否是闭包. 有内容就是闭包, 没有内容就不是闭包
inner() wrapper()
6. 迭代与迭代器
dir( ) 查看xx数据可执行哪些操作 dir( lst )
数据可执行操作中有__iter__,就是可迭代对象
获取迭代器 it = lst.__iter__() it就是迭代器
获取迭代器里面的一个数据 it.__next__()
官方通过代码判断是否是迭代器
from collections import Iterator,Iterable
print(isinstance(lst , Iterator)) True就是迭代器,False就不是迭代器
print(isinstance(lst , Iterable) True就是可迭代的,False就不可迭代
迭代器都是可迭代的, 可迭代的不一定是迭代器
迭代器的意义:统一数据类型的遍历工作
#模拟for循环
7.生成器
生成器本质就是一个迭代器
函数中包含yield,此函数就是生成器函数
生成器函数运行之后,是产生一个生成器,而不是运行函数
yield表示返回,但不会终止函数的执行,是分段的执行函数
执行生成器函数
ret = fn() #ret是创建一个生成器
ret.__next__() #生成器拿值
能向下执行的两个条件:
__next__(), 执行到下一个yield
send(), 执行到下一个yield, 给上一个yield位置传值
所有的生成器都是迭代器都可以直接使用for循环
都可以使用list()函数来获取到生成器内所有的数据
7 . 各种推导式
列表推导式 [结果 for循环 if条件]
字典推导式 {结果(k:v) for循环 if条件}
集合推导式 {结果(k) for循环 if条件}
元组没有推导式
8 . 生成器表达式
(结果 for循环 if条件)
python之函数的进阶的更多相关文章
- Python之函数的进阶(带参数的装饰器)
函数篇--装饰器二 带参数的装饰器 def outer(flag): def timer(func): def inner(*args,**kwargs): if flag: print('''执行函 ...
- 【转】Python之函数进阶
[转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...
- 小学生都能学会的python(函数的进阶)
小学生都能学会的python(函数的进阶) 1. 动态传参 形参: 1. 位置参数 2. 默认值参数 3. 动态传参 *args 动态接收位置参数 **kwargs 动态接收关键字参数 def fun ...
- Python之函数进阶
本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一.递归函 ...
- 十三. Python基础(13)--生成器进阶
十三. Python基础(13)--生成器进阶 1 ● send()方法 generator.send(value) Resumes the execution, and "sends&qu ...
- Python类的继承(进阶5)
转载请标明出处: http://www.cnblogs.com/why168888/p/6411918.html 本文出自:[Edwin博客园] Python类的继承(进阶5) 1. python中什 ...
- python基础篇之进阶
python基础篇之进阶 参考博客:http://www.cnblogs.com/wupeiqi/articles/5115190.html python种类 1. cpython 使用c解释器生产 ...
- Python学习day15-函数进阶(3)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day14-函数进阶(2)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
随机推荐
- spring重点知识分享
前言: spring是一个轻量级的开源的控制反转(Inversion of Control,IOC)和面向切面(AOP)的容器框架,它的主要目的是简化企业开发.这两个模块使得java开发更加简单.IO ...
- java弹框
Java弹窗操作 1.任务简介 本博客介绍两种Java弹窗操作的方法,第一个种是通过弹出对话框显示用户输入的信息,第二种是通过用户输入数字的不同打开不同的程序. 2.弹出对话框的操作 1)任务内容编程 ...
- C++ | 动多态 | 虚函数表
多态机制 C++语言有三大特性:封装.继承.多态. 其中所谓的多态,即 "同一接口,不同形态".接口在我们 C/C++ 语言中可以理解为函数名,不同形态可以理解为函数执行的功能不同 ...
- C++重载输入流、输出流运算符
在c++中类的私有成员是不能被直接访问的,需要通过类中提供的成员函数简介的操作这些数据.同时C++ 能够使用流提取运算符 >> 和流插入运算符 << 来输入和输出内置的数据类型 ...
- BFC理解
Block formatting context (块级格式化上下文) 页面文档由块block构成 每个block在页面上占据自己的位置 使用新的元素构建BFC overflow:hidden | a ...
- 学习webpack前的准备工作
前言 由于vue和react的流行,webpack这个模块化打包工具也已经成为热门.作为前端工程师这个需要不断更新自己技术库的职业,真的需要潜下心来学习一下. 准备工作(针对mac用户) 安装 hom ...
- 可想实现一个自己的简单jQuery库?(九)
Lesson-8 事件机制 在讲事件机制之前呢,我们有一个很重要的东西要先讲,那就是如何实现事件委托(代理). 只有必须先明白了如何实现一个事件委托,我们才能更好的去实现on和off.在我看来,on和 ...
- 从ES6重新认识JavaScript设计模式(三): 建造者模式
1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示. 建造者模式的特点是分步构建一个复杂的对象,可以用不同组合或顺序建造出不 ...
- c++类调用的一个小问题
先看这两段代码: #include <iostream> #include <vector> #include <algorithm> using namespac ...
- Python窗口学习之给按钮美化
tkinter的按钮很丑也很难改 怎么办呢? 最好的方法就是不用按钮! 给Label添加点击事件,和按钮的作用是一样的! 代码: #!/usr/bin/env python # -*- coding: ...