python学习第六次

变量作用域

  • 变量由作用范围限制
  • 分类:按照作用于分类
    - 全局(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:\统计\python\3.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:\统计\python\3.1.py", line 8, in <module>
    fun()
  File "E:\统计\python\3.1.py", line 7, in fun
    fun()
  File "E:\统计\python\3.1.py", line 7, in fun
    fun()
  File "E:\统计\python\3.1.py", line 7, in fun
    fun()
  [Previous line repeated 975 more times]
  File "E:\统计\python\3.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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值