1.Python所有的函数都有返回值(当函数没有return语句时,python会返回一个None)
>>> def print1():
print('hello')
>>> temp=print1()
hello
>>> temp
>>>
>>> print(temp)
None
>>> type(temp)
<class 'NoneType'>
2.Python可以返回多个不同类型的值。默认以逗号隔开,是以元组的形式返回。当然也可以用列表包含起来返回。
>>> def print2():
return 1,'heihei',1.2
>>> print2()
(1, 'heihei', 1.2)
>>> def print3():
return [1,'love',1.2]
>>> print3()
[1, 'love', 1.2]
3.变量分为局部变量(local variable)和全局变量(global variable):
①全局变量和局部变量的作用域
def add(local_a,local_b):
local_sum=local_a+local_b
print('全局变量globle_a=:',globle_a)
print('全局变量globle_b=:',globle_b)
return local_sum
globle_a=1
globle_b=2
globle_sum=add(globle_a,globle_b)
print('程序运行的结果是:globle_a+globle_b=',globle_sum)
print('试图访问局部变量local_a:',local_a) #试图访问函数的局部变量
#运行结果:
全局变量globle_a=: 1
全局变量globle_b=: 2
程序运行的结果是:globle_a+globle_b= 3
Traceback (most recent call last):
File "F:/学习/python/019_practice.py", line 11, in <module>
print('试图访问局部变量local_a:',local_a) #试图访问函数的局部变量
NameError: name 'local_a' is not defined
注:函数里面定义的变量是局部变量,当函数执行完之后,该函数会被自动删除,所以在函数的外部无法访问函数的局部变量。函数外定义的变量是全局变量,全局变量作用于整个代码段。
②试图在函数中修改全局变量(下列代码为什么修改失败了)
def add(local_a,local_b):
local_sum=local_a+local_b
#print('全局变量globle_a=:',globle_a)
#print('全局变量globle_b=:',globle_b)
#试图修改全局变量
globle_a=10
globle_b=20
print('试图修改后的globle_a=:',globle_a)
print('试图修改后的globle_b=:',globle_a)
return local_sum
globle_a=1
globle_b=2
globle_sum=add(globle_a,globle_b)
print('globle_a=:',globle_a)
print('globle_b=:',globle_b)
print('程序运行的结果是:globle_a+globle_b=',globle_sum)
#运行结果:
试图修改后的globle_a=: 10
试图修改后的globle_b=: 10
globle_a=: 1
globle_b=: 2
程序运行的结果是:globle_a+globle_b= 3
>>>
注:上面程序在函数内部试图修改全局变量,python会在函数内部重新定义一个与全局变量名称相同的局部变量,使得所有对全局变量的修改都是无效的。(虽然可以在函数中修改全局变量的值,但是最好不要试图在函数内部修改全局变量)
a=1
def add():
#试图在修改全局变量前访问全局变量
print('全局变量a=:',a)
#试图修改全局变量
a=10
add()
#运行结果:
UnboundLocalError: local variable 'a' referenced before assignment
注:Python为了保护变量的作用域,所以将add函数意外的变量屏蔽起来,此时是无法访问到此函数外的a变量
练习1:下面程序会打印什么内容:
st='hello world'
def function1():
global st
st='I '
return function2(st)
def function2(st):
st+='love you'
function3(st)
return st
def function3(st):
st='你好'
print(function1())
print(st)
#打印结果:
I love you
I
>>>
注1:在函数中重新声明的全局变量覆盖了原来的全局变量,新的全局变量在函数调用时并没有发生改变。
注2:函数3没有返回值,所以函数2相当于没有调用函数3
注3:使用全局变量会使:代码的可读性变差、代码安全性降低;
练习2:编写一个函数判断字符串是否为回文联(回文联:正读倒读都一样,例如:上海自来水来自海上)
#方法1:使用列表的逆置函数
def judge(st):
st=list(st)
st1=st
st2=list(reversed(st1)) #逆置列表,返回一个迭代器对象
if st1==st2:
print('是回文联')
else:
print('不是回文联')
judge('上海自来水来自海上')
#方法2:使用for循环
def judge2(st):
flag=1
length=len(st)//2
j=len(st)-1
for i in range(length):
if st[i]!=st[j]:
flag=0
break
j-=1
if flag==0:
print('不是回文联')
else:
print('是回文联')
judge2('上海自来水来自海上')
练习3:编写一个函数,统计传入函数的各种类型参数(字母、数字、其他参数)的个数
def judge3(*params):
length=len(params)
for i in range(length):
letters=0
digits=0
others=0
for each in params[i]:
if each.isalpha():
letters+=1
elif each.isdigit():
digits+=1
else:
others+=1
print('第{0}个字符串共有:{1}个字母,{2}个数字,{3}个其他字符'.format(i,letters,digits,others))
judge3('12aa..','sss')
#运行结果 :
第0个字符串共有:2个字母,2个数字,2个其他字符
第1个字符串共有:3个字母,0个数字,0个其他字符