概述
变量作用域
- 变量由作用范围限制
- 分类:按照作用于分类
- 全局(global):在函数外部定义
- 局部(local):在函数内部定义 - 变量的作用范围:
- 全局变量:在整个全局范围内都有效
- 全局变量在局部可以使用
- 局部变量在局部分为内可以使用
- 局部变量在全局范围内无法使用
- LEGB原则
- L-----local 局部名字空间
- E-----enclosing 直接外围空间
- G-----global 全局名字空间
- B-----builtin 内建名字空间
#in[1]
#全局变量的运用
a1=2 #定义全局变量a1
def fun():
print(a1)
a2=99
print("i am in fun")
print(a2) #此处为局部变量
print(a1)
fun()
#out[1]
2
#从此行之后为fun()的结果
2
i am in fun
99
#in[2]
#若在全局输出局部变量会出现的情况
a1=2 #定义全局变量a1
def fun():
print(a1)
a2=99
print("i am in fun")
print(a2) #此处为局部变量
print(a1)
print(a2)
#out[2]
2
Traceback (most recent call last):
File "E:统计python3.1.py", line 10, in <module>
print(a2)
NameError: name 'a2' is not defined
提升局部变量为全局变量
- globals,locals函数
- 可以通过globals和locals显示局部变量和全局变量
- 参考一下案例
#in【3】
a=1
b=2
def fun(c,d):
e=111
print("Locals={}".format(locals()))
print("Globals={}".format(globals()))
fun(100,200)
#out[3]
Locals={'c': 2, 'd': 3, 'e': 111}
Globals={'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:\统计\python\3.1.py', 'a': 1, 'b': 2, 'fun': <function fun at 0x000001E1680FC1E0>}
eval()函数
- 把一个字符串当成表达式来执行,返回表达式执行后的结果
- 语法:
- eval(string_code,global=none,local=none)
exec()函数
- 跟eval 用法一致不返回结果
- exec(string_code,global=none,local=none)
#in[4]
x=100
y=100
z1=x+y
z2=eval("x+y")
print(z1)
print(z2)
#out[4]
200
200
#in[5]
#exec()范例
x=100
y=100
z1=x+y
z2=exec("x+y")
print(z1)
print(z2)
#out[5]
200
None
递归
- 函数直接或者间接调用自己
- 优点:简洁容易理解
- 缺点:对递归深度有限制,消耗资源大
#in【6】
x=0
def fun():
x+=1
print(x)
fun()
fun()
#out[6]
Traceback (most recent call last):
File "E:统计python3.1.py", line 8, in <module>
fun()
File "E:统计python3.1.py", line 7, in fun
fun()
File "E:统计python3.1.py", line 7, in fun
fun()
File "E:统计python3.1.py", line 7, in fun
fun()
[Previous line repeated 975 more times]
File "E:统计python3.1.py", line 6, in fun
print(x)
RecursionError: maximum recursion depth exceeded while pickling an object
注意递归的时候一定要注意递归次数,不要无限循环
#in[7]
#斐波那契
def f(n):
if n == 1:
return 1
if n ==2:
return 2
return f(n-1)+f(n-2)
for i in range(1,11) :
print(f(i))
#out[7]
1
2
3
5
8
13
21
34
55
89
内置数据结构(变量类型)
- list
- set
- dict
- tuple
list(列表)- 一组顺序的数据的组合
- 创建列表
- 空列表
#in【8】
#创建空列表
l1=[]
print(type(l1))
print(l1)
l2=[1,2,3]
print(type(l2))
print(l2)
#iut[8]
<class 'list'>
[]
<class 'list'>
[1, 2, 3]
列表相关操作
- 访问
- 使用下标索引
- 列表的顺序是从0开始的
- 分片操作
- 对列表任何一部分进行截取
- l[:]
#in[9]
#访问列表中的数
l=[1,5,3,6,9,7,8]
print(l[2])
#out[9]
3
#in[10]
#对列表进行截取
l=[1,3,4,5,6,9,78,5]
#注意截取的范围,包含左边的下标值,不包含右边的下标值
print(l[2:5])
#下标为空时,截取所有
print(l[:])
#分片操可以控制增长幅度,默认幅度为1
print(l[1:6:2])
#下标可以超出范围,超出后不考虑多余的
#下标值可以为负数,为负数时表示顺序从右往左(从-1,-2,-3.。。。)
#out[10]
[4, 5, 6]
[1, 3, 4, 5, 6, 9, 78, 5]
[3, 5, 9]
#in【11】
#分片操作之负数下标
l=[1,2,3,4,5,6,7,8]
print(l[-6:-1])
#正常情况下左边的值要比右边的值小
#如果一定左边的要比右边的大,则步长一定要用负数,表示从右往左
print(l[-2:-5:-1])
#Out[11]
[3, 4, 5, 6, 7]
[7, 6, 5]
分片操作是生成一个新的LIST
- 内置函数ID,负责显示一个变量或者数据的唯一确定编号
#in【12】
#通过id可以直接判断出分片是从新生成的一份数据还是使用的同一份数据
l=[1,2,3,4,5,6]
ll=l[:]
#如果两个id值一样,则表明分片产生的列表是使用同一地址的相同数据
#否则,则表明分片是新生成了一份数据
print(id(l))
print(id(ll))
#out[12]
2454745518216
2454745508872
最后
以上就是发嗲大山为你收集整理的python学习第六次的全部内容,希望文章能够帮你解决python学习第六次所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复