1.
def test(name):
print ('before',name)
name = '22' #该name变量属于局部变量,只在该函数中生效;该局部就相当于一个作用域
print ('after',name) #name引用的是局部变量的name
name = 11 #全局变量:函数外面的变量就是全局变量;全局变量在整个程序中都生效。
test(name) #赋值给test函数的name参数,这个值引用的是全局变量的name
print (name) #引用的是全局变量
可以看到函数中的局部变量不会影响 全局的变量。
可以通过global的方式在函数中把变量变成全局变量(不是引用全局变量),然后就可以对全局变量进行修改了。
可以看到全局没有变量,在函数中使用global也是可以的;
不过在实际编程中不建议使用global,不要在函数中修改全局变量,因为编程时一个函数可能会被多次调用,当一个程序写的比较复杂时,且函数被调用多次,会很难找到一个变量到底在哪里被修改,会造成非常混乱的情况。 这样情况出错很难调试。
2.
函数中的局部变量不能修改全局变量,也只限于简单的字符串和整数
稍微复杂点形式的变量,比如列表,是可以被修改的。 列表、字典、集合、类等都可以被修改,元组本身就是不可变的,所以不能修改。
3.递归
函数可以调用其他的函数,函数调用自身就叫做递归。
最多可以调用999次(999层),这是python的保护几次,防止无限调用下去,导致机器卡死。
但是自身循环999次没有任何意义,所以必须要有一个明确的结束条件
设立结束条件 n/2 >0,递归不断的除以2
小数点也大于0,所以会一直除以2
2.3891548633682403e-298 最后会计算成这样的数字,这数字e后面的多少是十的负几次幂,也属于小数点。
int将数字变成整数就不会出现小数点了,然后就可以整除了。
效果与使用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)
转载于:https://blog.51cto.com/daimalaobing/2046668