上节复习
def test(x,y,z,type='xx'):
'注释’
代码
return res
test(1,2,3) # 位置参数要在关键字参数左边
test(z=1,x=2,y=3) #关键字传递
默认参数 type不传的话可以按照默认值xx来进行,如果有变可以传
def test(x,*args,**kwargs): #*args 接收多个参数 形成元祖的形式
# **kwargs接收多个参数x= ,y= kwargs 形成字典的形式
'注释'
代码
return res
http://www.cnblogs.com/linhaifeng/articles/6113086.html#_label1点击打开链接
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
name='dafa'
def change_name():
name='帅了一笔'
print('我的名字',name)
change_name()
print(name)
输出是
我的名字 帅了一笔 #在此函数内的局部变量有定义先用局部变量的值,没有定义用全局变量的值
dafa # 在那个函数外调用的都是全局变量的值
def change_name():
global name #在局部定义域中声明全局变量,这时候修改可以对函数外的变量造成变化 ,但是如果其他函数内没写有global 的name还是局部变量
name='帅了一笔' #修改全局变量了
print('我的名字',name)
change_name()
print(name)
# 我的名字 帅了一笔
# 帅了一笔
如果函数的内容无global关键字定义全局变量,优先读取局部变量,
并且能读取全局变量无法重新赋值给全局变量 name='dsaf'
但是,对于可变类型,可以对内部元素进行操作
例如可以在函数内 name.append('abc') 这样也会对全局变量的name造成改变
如果有global关键字,变量本质是全局变量, 可以读取和赋值 name='dsaf'一定要先定义全局变量再修改值,不能反过来,
建议 也可以全局变量写大写,局部变量变量名小写可以更清晰分清。
name='海风'
def huangwei():
name = "黄伟"
print(name) # 2
def liuyang(): #内部再定义一个函数,函数定义声明如果未调用则先编译,但不执行
name = "刘洋"
print(name) # 4
def nulige():
name = '炉指花'
print(name) # 7
print(name) # 5
nulige() # 6
liuyang() # 3
print(name) # 8
print(name) # 0
huangwei() # 1
print(name) # 9
输出结果
海风
黄伟
刘洋
刘洋
炉指花
黄伟
海风
name ='000' # 00
def yu1():
name='001' # 2 这里是001的局部变量
def yu2(): # 4
global name # 5 这里指向的是000的全局变量
name='002' # 6 将000的全局变量变成002
# nolocal name *** 如果关键字global 变成nolocal,则指的是上一层的变量001
# name='002' ****这里也会将001的那个局部变量变成002 而全局变量没有改
# ***使得最后的输出变成000 002 000
yu2() # 3
print(name) # 7 这里输出的是001的局部变量的值,在这一层先找这一层的局部变量,如果找不到才能找那个把000变成002的全局变量
print(name) # 0 这里输出000
yu1() # 1
print(name) # 8 最后输出002
输出 第5步用global
000 001 002
如果第5步是用关键字nolocal
000 002 00
内层函数可以拿外层函数的变量,但是外层想拿内层的值需要return返回值来获取
def foo():
print('from foo')
bar()
foo() #报错,bar()在foo()后找不到
def bar():
print('from bar')
递归调用
自己调用自己
def calc(n):
print(n)
if int(n/2) ==0: # 10/2 5/2 2/2
return n
return calc(int(n/2))
calc(10)
输出:
10
5
2
1
# debug步骤 全点红,右键debug 点小三角一步步运行
import time
person_list=['alex','wupeiqi','linhaifeng','zsc']
def ask_way(person_list):
print('-'*60)
if len(person_list) == 0:
return '根本没人知道'
person=person_list.pop(0) #每次减少一个人
if person == 'linhaifeng':
return '%s说:我知道,华电就在昌平,下地铁就是' %person
print('hi 美男[%s],敢问路在何方' % person)
print('%s回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问%s...' % (person, person_list))
time.sleep(1)
res=ask_way(person_list) #第一次 alex还没有执行完,res还没有得到值,
#也没有执行后边的,就执行下一个ask_way()函数 这时alex的res还在等待值return
print('%s问的结果是: %res' %(person,res))
return res
res=ask_way(person_list)
print(res)
结果
------------------------------------------------------------
hi 美男[alex],敢问路在何方
alex回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['wupeiqi', 'linhaifeng', 'zsc']...
------------------------------------------------------------
hi 美男[wupeiqi],敢问路在何方
wupeiqi回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['linhaifeng', 'zsc']...
------------------------------------------------------------
wupeiqi问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
alex问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是
res结果的取得是经过许多等待,并没有能够马上获得,只有下一个获得后再一个个return返回
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)