第四篇:python基础_4
本篇内容
- 名称空间与作用域
- 闭包函数
- 装饰器
- 迭代器
- 生成器
- 三元表达式
- 列表解析
- 生成器表达式
一、 名称空间与作用域
1.名称空间
存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方。名称空间有分为三类,分别为内置名称空间、全局名称空间、局部名称空间。
加载顺序:内置名称空间 ------> 全局名称空间 ------> 局部名称空间
名字查找顺序:局部名称空间 ------> 全局名称空间 ------> 内置名称空间
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei max = 1
def foo():
max = 2
print(max) foo()
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei max = 1
def foo():
#max = 2
print(max) foo()
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei #max = 1
def foo():
max = 2
print(max) foo()
(1)内置名称空间
在python解释器启动时产生,存放一些python内置的名字。
max() len() int() str() float()
(2)全局名称空间
在执行文件时产生,存放文件级别定义的名字。
x = 1
def func():
y =2
def f1():
pass
print x class foo:
pass if x == 1:
z = 3
(3)局部名称空间
在执行文件的过程中,如果调用了函数,则会产生该函数的局部名称空间。用来存放该函数内定义的名字,该名字在函数调用时生效,在函数调用结束后失效。
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei def foo():
x = 2
print(x) foo()
2.作用域
作用域,即作用的范围。
(1)全局作用域
全局作用域:全局存活,全局有效
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei x = 1
def test():
def test1():
def test2():
print(x)
test2()
test1() test()
(2)局部作用域
局部作用域:临时存活,局部有限
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei x = 1
def test():
def test1():
def test2():
x = 2
print(x)
test2()
test1()
print(x) test()
(3)作用域关系
在函数定义时就已经固定,与调用关系无关,在函数调用时,必须回到函数原来定义的位置去找作用域关系。
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei x = 1
def f1():
x = 1000
def f2():
x = 2000
print(x)
return f2 def foo(func):
func() foo(f1())
二、闭包函数
定义在函数内部的函数,包含对外部作用域名字的引用,而不是对全局作用域名字的引用,那么该内部函数就称为闭包函数。
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei x = 1
def test():
x = 11111
def test_1():
print(x)
return test_1 func = test()
func()
闭包函数的应用
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei import requests
def f1(url):
def f2():
print(requests.get(url).text)
return f2 python_web = f1("https://www.python.org")
baidu_web = f1("https://www.baidu.com") python_web()
baidu_web()
三、装饰器
更改线上代码要遵守开放封闭原则,即对扩展是开放的,对修改是封闭的。
装饰器,装饰它人的工具,装饰器本身可以是任意可调用对象,被装饰的对象本身也可以是任意可调用对象。
装饰器的遵循的原则:1.不修改被装饰对象的源代码2.不修改被调用对象的调用方式。
装饰器的目的是:在遵循1和2原则的前提,为其他新功能函数添加。
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei import time def timeer(func):
def wapper():
start_time = time.time()
func()
stop_time = time.time()
print("run time is %s" %(stop_time - start_time))
return wapper @timeer
def foo():
print("the is foo")
time.sleep(2)
return 123 @timeer
def bar():
print("the is bar")
time.sleep(3) foo()
bar()
有参装饰器
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei if_name = {"users":None}
def login(func):
def wapper(*args,**kwargs):
if if_name["users"]:
return func(*args,**kwargs)
user = input("username:").strip()
passwd = input("password:").strip()
with open("db.txt",encoding="utf-8") as file:
data = eval(file.read())
print(data)
if user in data and passwd == data[user]:
res = func(*args,**kwargs)
if_name["users"] = user
return res
else:
print("login is error")
return wapper @login
def index():
print("the is index,welcome~")
index() @login
def home(name):
print("the is home,%s welcome~" % name)
home("yanglei")
四、迭代器
迭代:是一个重复的过程,每一次重复,都是基于上一次的结果而来。
迭代器对象的优点:
1:提供了一种统一的(不依赖于索引的)迭代方式
2:迭代器本身,比起其他数据类型更省内存
迭代器对象的缺点:
1:一次性,只能往后走,不能回退,不如索引取值灵活
2:无法预知什么时候取值结束,即无法预知长度
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei while True: #单纯的重复
print('你瞅啥') l=['a','b','c','d']
count=0
while count < len(l):
print(l[count])
count+=1
迭代器:
可迭代对象iterable:凡是对象下有__iter__方法:对象.__iter__,该对象就是可迭代对象
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei s='hello'
l=['a','b','c','d']
t=('a','b','c','d')
dic={'name':'yanglei','sex':'m',"age":18}
set1={1,2,3}
f=open('db.txt') s.__iter__()
l.__iter__()
t.__iter__()
dic.__iter__()
set1.__iter__()
f.__iter__()
迭代器对象:可迭代对象执行内置的__iter__方法,得到的结果就是迭代器对象
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei dic={'name':'yanglei','sex':'m',"age":18} i=dic.__iter__()
print(i) #iterator迭代器 i.__next__() #next(i)
print(next(i))
print(next(i))
print(next(i))
print(next(i)) #StopIteration l=['a','b','c','d'] i=l.__iter__()
print(next(i))
print(next(i))
print(next(i))
print(next(i))
print(next(i)) #StopIteration
五、生成器
生成器:在函数内部包含yield关键,那么该函数执行的结果是生成器
生成器就是迭代器
yield的功能:
1 把函数的结果做生迭代器(以一种优雅的方式封装好__iter__,__next__)
2 函数暂停与再继续运行的状态是由yield
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei 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)) print(next(g))
print('======>')
print(next(g))
print('======>')
print(next(g))
print('======>')
print(next(g)) for i in g: #i=iter(g)
print(i)
六、三元表达式
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei def foo(x):
if x > 3:
return 'ok'
else:
return 'no' x=10
res=x if x > 3 else 'no'
print(res)
七、列表解析
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei nums=[1,2,3,4,5,6]
nums_new=[item**2 for item in nums if item > 3]
print(nums_new)
八、生成器表达式
#!/usr/bin/env pyhon
#encoding: utf-8
#auth: yanglei # [{'name': 'apple', 'price': 333, 'count': 3}, ]
with open('db.txt',encoding='utf-8') as f:
info=[{'name':line.split()[0],
'price':float(line.split()[1]),
'count':int(line.split()[2])} for line in f if float(line.split()[1]) >= 30000]
print(info)
第四篇:python基础_4的更多相关文章
- 【Python之路】第四篇--Python基础之函数
三元运算 三元运算(三目运算),是对简单的条件语句的缩写 # 书写格式 result = 值1 if 条件 else 值2 # 如果条件成立,那么将 “值1” 赋值给result变量,否则,将“值2” ...
- 第四篇.python的基础
目录 第四篇.python基础01 1. 变量 2. 常量 3. python变量内存管理 4. 变量的三个特征 5. 花式赋值 6. 注释 7. 数据类型基础 8. 数字类型 9. 字符串类型 10 ...
- 【0728 | 预习】第三篇 Python基础
第三篇 Python基础预习 Part 1 变量 一.什么是变量? 二.为什么要有变量? 三.定义变量 四.变量的组成 五.变量名的命名规范 六.变量名的两种风格 Part 2 常量 Part 3 P ...
- python学习第四讲,python基础语法之判断语句,循环语句
目录 python学习第四讲,python基础语法之判断语句,选择语句,循环语句 一丶判断语句 if 1.if 语法 2. if else 语法 3. if 进阶 if elif else 二丶运算符 ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
- 四、Python基础(1)
目录 四.Python基础(1) 四.Python基础(1) 1.什么是变量? 一种变化的量,量是记录世界上的状态,变指得是这些状态是会变化的. 2.为什么有变量? 因为计算机程序的运行就是一系列状态 ...
- 前端第四篇---前端基础之jQuery
前端第四篇---前端基础之jQuery 一.jQuery介绍 二.jQuery对象 三.jQuery基础语法 四.事件 五.动画效果 六.补充each 一.jQuery简介 1.jQuery介绍 jQ ...
- spring cloud系列教程第四篇-Eureka基础知识
通过前三篇文章学习,我们搭建好了两个微服务工程.即:order80和payment8001这两个服务.有了这两个基础的框架之后,我们将要开始往里面添加东西了.还记得分布式架构的几个维度吗?我们要通过一 ...
- 第一篇:python基础
python基础 python基础 本节内容 python起源 python的发展史 为什么选择python3 第一个python程序 变量定义 表达式和运算符 用户输入 流程控制 判断 流程控制 ...
随机推荐
- vue组件 $children,$refs,$parent的使用
如果项目很大,组件很多,怎么样才能准确的.快速的寻找到我们想要的组件了?? 1)$refs 首先你的给子组件做标记.demo :<firstchild ref="one"&g ...
- 由一道CTF pwn题深入理解libc2.26中的tcache机制
本文首发安全客:https://www.anquanke.com/post/id/104760 在刚结束的HITB-XCTF有一道pwn题gundam使用了2.26版本的libc.因为2.26版本中加 ...
- 更新MySQL数据库( java.sql.SQLException: No value specified for parameter 1) 异常 解决方法
package com.swift; import java.io.File; import java.sql.Connection; import java.sql.PreparedStatemen ...
- 51nod——1640 天气晴朗的魔法 有边权限制的最大生成树
好好读题嗷:“所以我们要求阵中的魔法链的魔力值最大值尽可能的小,与此同时,魔力值之和要尽可能的大.” 第一条件是生成树的最大边权更小,第二条件是在最大边权的限制下搞一个最大生成树. 至于最大生成树,如 ...
- 微信公众帐号开发之一(java)
闲来没事,就记录一下微信公众平台的开发吧~ 其实微信公众平台开发没有想象中的那么困难,因为注册了微信公众平台帐号登录之后在开发者模式里有详细的文档,个人感觉介绍还是比较详细的. 微信公众平台订阅号和服 ...
- 2.在Cisco Packet Tracer里交换机默认网关的配置(实现跨网段telnet)
我们将在此拓扑图的基础上进行实验 大多命令都可用tab键位来补齐 1.分别给pc机设置好ip地址 pc2为:192.168.1.1 pc3为:192.168.2.1 两台计算机处在不同的网段之中 2. ...
- hive数据的导入导出方式
导入方式 1.load方式 load data local inpath 'local_path' into table tb_name; 从本地复制了文件到表的路径下 应用场景:大部分的使用,文件几 ...
- MTCNN学习进展
20190618 截止今日,学习了MTCNN预测部分的内容,包括三个网络输入输出之类的东西. 之后需要进一步学习的,NMS原理鞋机,MTCNN训练过程细节,损失函数细节
- 遗传算法 | C++版GA_TSP
嗯哼,时隔半年,再次有时间整理关于组合优化问题——旅行商问题(Traveling Salesman Problem, TSP),这次采用的是经典遗传算法(Genetic Algorithm, GA)进 ...
- 菜鸟学Linux - 设置文件/文件夹的权限
在Linux中,我们可以对文件或文件夹设置权限(r,w,x,-).然而,对文件和文件夹的权限设置,具有不同的意义.下面,通过几个例子来了解一下权限的意义所在.在开始之前,我们需要了解几个修改权限的命令 ...