Python15 作用域、局部与全局变量

1.

def test(name):

    print ('before',name)

    name = '22'             #该name变量属于局部变量,只在该函数中生效;该局部就相当于一个作用域

    print ('after',name)    #name引用的是局部变量的name

name = 11        #全局变量:函数外面的变量就是全局变量;全局变量在整个程序中都生效。

test(name)        #赋值给test函数的name参数,这个值引用的是全局变量的name

print (name)     #引用的是全局变量

image_1c0aj798er3o1re71ue61vnblgu9.png-2.1kB

image_1c0aj7ghbf3q1i2t15kp1gmskj4m.png-13.4kB
image_1c0aj7loe3c41v11r35ufu81d13.png-1kB
可以看到函数中的局部变量不会影响 全局的变量。

image_1c0aj85e81m2dn7m1dt31mga1p9u1g.png-7.5kB
image_1c0aj8ev71cbnhkd3r9q461m1u1t.png-0.5kB
可以通过global的方式在函数中把变量变成全局变量(不是引用全局变量),然后就可以对全局变量进行修改了。

image_1c0aj8ota16oj9cpa381lo7184d2a.png-6.9kB
image_1c0aj8uqrhme1ivt1q1f75u13c52n.png-1.2kB
可以看到全局没有变量,在函数中使用global也是可以的;
不过在实际编程中不建议使用global,不要在函数中修改全局变量,因为编程时一个函数可能会被多次调用,当一个程序写的比较复杂时,且函数被调用多次,会很难找到一个变量到底在哪里被修改,会造成非常混乱的情况。 这样情况出错很难调试。

2.

image_1c0aj9fh978b19g5kh1rfq1p4d34.png-8.4kB

image_1c0aj9l691eb1115c10ql5rk1rvp3h.png-1.9kB
函数中的局部变量不能修改全局变量,也只限于简单的字符串和整数

image_1c0aja35n1o0gauc1lqc17912un3u.png-8.7kB

image_1c0ajbsvtiu33nu1ufrlj613o77l.png-2.2kB
稍微复杂点形式的变量,比如列表,是可以被修改的。 列表、字典、集合、类等都可以被修改,元组本身就是不可变的,所以不能修改。

3.递归

函数可以调用其他的函数,函数调用自身就叫做递归。
image_1c0ajbnru15no8e75ob1sg5ojs78.png-12.1kB

image_1c0ajd65jeno10dv2ib4fcfht82.png-35kB

最多可以调用999次(999层),这是python的保护几次,防止无限调用下去,导致机器卡死。

但是自身循环999次没有任何意义,所以必须要有一个明确的结束条件

image_1c0ajdsf7kb2ikg10241idq1st28f.png-7.7kB
设立结束条件 n/2 >0,递归不断的除以2
image_1c0aje57h1rkvqvvopn3u61j08s.png-9.7kB
小数点也大于0,所以会一直除以2

2.3891548633682403e-298 最后会计算成这样的数字,这数字e后面的多少是十的负几次幂,也属于小数点。

image_1c0ajf0sfdlj15es1og11kgl11t199.png-8.2kB

image_1c0ajf8hvmvrdq21ot9nhv1ttj9m.png-1.2kB

int将数字变成整数就不会出现小数点了,然后就可以整除了。

image_1c0ajg8bi13081lau1jqnok3nqka3.png-13kB
效果与使用int一样,不能有小数点,必须是整数来整除

递归特性:

  • 必须有一个明确的结束条件

  • 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 (比如第一层列表是10个,下一次,也就是下一次调用自身列表中的元素就要比10要少)

  • 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

4.函数式编程

此函数非非彼函数,之前学的函数是函数中编写一些代码,而这里要将的函数是指数学中的函数运算。

函数式编程,只要输入是确定的,输出就是确定的。

对于计算机来说越抽象,计算效率就越低,python就属于这种,所以python语言不适合做函数式编程。

适合函数式编程的语言有lisp、hashshell、erlang

5.高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

def add(a,b,f):
    return f(a)+f(b)

res = add(3,-6,abs)       

 #abs是python自带的一个函数,将数字变成绝对值,也就是会将负数6变成正数6,这里就相当于3+6=9
print (res)

image_1c0ajkm3p1ra8a3i1ji3h2o19kfag.png-0.4kB

转载于:https://blog.51cto.com/daimalaobing/2046668

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值