今日学习:python函数变量和递归函数
一、全局变量和局部变量
全局变量:没有缩进,在顶头的变量。一般用大写字母表示
局部变量:在子程序中定义的变量。一般用小写字母表示
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
global +变量名:表示引用和读取全局变量。
nonlocal +变量名:表示引用和读取局部变量。
NAME = "apple"
def taxt():
name="banana"
print(name)
def num():
global NAME
NAME = "cat"
num()
print(NAME)
taxt()
print(NAME)
>>> apple
banana
cat
补充:
1.若函数内部无关键字(global),则优先读取局部变量,没有再读取全局变量,且无法对全局变量重新赋值,对于全局变量为可变类型(即元祖、字典)时,则可以对内部元素进行改增删。
2.若函数内部有关键字(global),则本质上就是调用了全局那个变量,可读取可修改。
3.在读取变量时,优先在自己的作用域中寻找,没有再往后一层层找。
二、风湿理论:函数即变量
函数其实就相当于把里面的函数体当做一个个字符存放在内存中,需要调用函数时再进入这段存储函数的内存中存取出来,内部有嵌套就一一往内读取,再往外一层层return回值。
def foo(a):
print("apple")
coo()
def coo(b)
print(2)
foo()
三、递归函数
函数自己调用自己的函数名就叫递归.
特性:1、必须要有一个明确的结束条件(用return);
2、每进入深一层递归时,问题规模相比上次递归都应有所减少;
3、效率不高,递归层次过多会导致栈溢出(内存撑爆)。
def calc(n):
print(n)
if int(n/2)==0:
return n
return calc(int(n/2))
calc(10)
>>> 10
5
2
1
示例:问路
import time
list=["apple","banana","cat","dog")
def like(list):
print("-"*60)
if len(list)==0:
print("没人知道")
li=list.pop(0)
if li=="cat":
print("%s说:我知道路在哪,在莱茵湖边"%li)
print("hi,%s,你知道路在哪里吗"%li)
print("%s说,我不知道,我帮你问问%s"%(li,list))
time.sleep(5)
res=like(list)
return res
res=like(list)
print(res)
>>>
----------------------------------------
hi,apple,请问你知道路往哪走吗
apple回答说:不知道,我帮你问问['banana', 'cat', 'dog']
----------------------------------------
hi,banana,请问你知道路往哪走吗
banana回答说:不知道,我帮你问问['cat', 'dog']
----------------------------------------
cat说,我知道在哪里,在莱茵湖边
练习&复习
1、有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66的所有值, 'k2': 小于66的所有值}
a = [11,22,33,44,55,66,77,88,99,90]
b = {"key1":[],"key2":[]}
for i in a:
if i>=66:
b["key1"].append(i)
elif i<66:
b["key2"].append(i)
print(b)
2、查找列表中元素,移除每个元素的空格,并查找以 a或A开头 并且以 c 结尾的所有元素。
li = ["alec", " aric", "Alex", "Tony", "rain"]
tu = ("alec", " aric", "Alex", "Tony", "rain")
dic = {'k1': "alex", 'k2': 'a ric', "k3": "Alex", "k4": "Tony"}
for a in range(len(li)):
li[a]=li[a].replace(" ","")
print(li)
tu = list(tu)
for b in range(len(tu)):
tu[b]=tu[b].replace(" ","")
tu = tuple(tu)
print(tu)
for c in dic:
dic[c]=dic[c].replace(" ","")
print(dic)
for a1 in li:
if (a1.startswith("a") or a1.startswith("A")) and a1.endswith("c"):
print(a1)
for b1 in tu:
if (b1.startswith("a") or b1.startswith("A")) and b1.endswith("c"):
print(b1)
for c1 in dic:
c2=dic[c1]
if (c2.startswith("a") or c2.startswith("A")) and c2.endswith("c"):
print(c2)
3、商品
a = ["手机", "电脑", '鼠标垫', '游艇']
for i,a1 in enumerate(a,1):
print(i,a1)
b=input("请输入商品编号")
b1=int(b)
print(a[b-1])
以上。