一 函数的作用域是有规律可循的,首先应该声明在使用,如果没有声明直接使用就会报错,需要注意的一点是,全局变量和局部变量不能相互影响:
x
=
6
def
f():
print
(x)
x
=
5
f()
这里会报错,如果全局变量可以在局部变量中使用的话,那么运行之后不会报错,但是把x
= 5 进行注明后,还是报错,所以,由此可得,这里不能共通,且顺序必须是先声明在使用!
先定义一个阶乘的方式
def num(n): nums = 1 for i in range(1,n): nums = nums * i return nums print(num(10)) '''对应的说明: 第一行:定义一个函数-num 先定义一个数字nums = 1(说明)乘法里面要用1,加减法里面要用0,这样对数据不会破坏 用for..in ...的方式将n从数列range中一个个赋值到i上并且列印出来后面的备注(1,n)作用是指的将0跳过 然后用之前定义的nums等于nums*i 这样可以进行阶乘 将nums数字重新定义并且返回循环 打印出num(1-9)的阶乘函数结果为:362880 '''说明递归函数的两个特点:
1/自我调动数值,
2/必须要有一个结束的需求,或者是条件,否则将会无限循环
看例子:
#定义一个递归函数 def fact(n): if n == 1: return 1 return n*fact(n - 1) print(fact(10)) '''定义一个递归函数fact(n)这个n指的是不定向函数 注明条件如果n ==1 两个等号是相等于,不是赋值的意思 返回1 如果不等于一,那就应该自减自乘,然后进行累积 '''
递归的函数优点就是非常清晰明了的解释,大家看到代码之后就会很清晰明了!
而且设计代码也很简单,但是对应的就是工作效率慢!意思就是用时间换效率....
所以使用的场合需要慎重,慎用慎用...
比如...汉诺塔..是很经典的函数....
def move(n, a, b, c):
if(n == 1):
print(a,"->",c)
return
move(n-1, a, c, b)
move(1, a, b, c)
move(n-1, b, a, c)
move(3, "a", "b", "c")
很经典..可以适当的深入研究,这里就不在赘述,有需要可以自己查查....
这里用递归非常简单明了,只需要写出步骤,那么,系统自动给你计算,如果用for....in.....明年都滤不清楚...
所以这个东西优点与缺点一样清晰...
讲一讲几个特殊的遍历函数
map() filter() 两个共同点,就是两个作用基本相同,都是遍历的作用,但是区别是,map()之后会进行数值的更改,干事filter()仅仅起到过滤作用,并不对源代码进行修改 例子: str = ['a','b','c'] def fun(s): return s + 'leon' a = map(fun,str) print(a) print(list(a)) 输出效果为:<map object at 0x0000000001E8C1D0> ['aleon', 'bleon', 'cleon'] str = ['a','b','c'] def fun(s): return s + 'leon' a = filter(fun,str) print(a) print(list(a)) # 输出效果为:<filter object at 0x000000000222C1D0> # ['a', 'b', 'c']