1.返回值
动态的确定类型
2.函数变量的作用域
局部变量
函数中定义的参数和变量,在函数之外都是无效的变量
全局变量
函数之外的变量,全局变量,作用域为整段代码
def discount(price,rate):
final_price=price*rate #局部变量
#print('打印全局变量:',old_price)
old_price=50 #创造一个名字一样的局部变量
print('修改后old_price的值是:',old_price)
return final_price
old_price=float(input("请输入原价:")) #全局变量
rate=float(input("请输入折扣率:"))
new_price=discount(old_price,rate)
print("折后价",new_price)
3.内嵌函数
1)global关键字
global关键字可以把局部变量变成全局变量
2)内嵌函数
def fun1():
print('fun1证在被调用...')
def fun2():
print('fun2正在背调用...')
fun2()
结果为:
fun1证在被调用...
fun2正在背调用...
#注:但是在fun1()这个函数之外 fun2()不存在
3)闭包
def funx(x):
def funy(y):
return x*y
return funy
结果:
i=funx(8)
>>> type(i)
<class 'function'>
可以这样用:i(5)=40
或者funx(8)(5)
结果为:40
#注:funy不能修改funx函数中funy以外的变量,类似于全局变量与局部变量
习题及答案
第19讲:
0.编写一个符合一下要求的函数
a)计算打印所有参数的和乘以基数(base=3)的结果
b)如果参数中的最后一个参数为(base=5),则 设定基数为5,基数不参与求和计算
def myfun(*paras):
length=len(paras)
sum=0
if paras[length-1]==5:
for i in range(length-2):
sum+=paras[i]
result=sum*5
else:
for i in range(length-1):
sum+=paras[i]
result=sum*3
return result
1.寻找水仙花数
题目要求:如果一个三位数等于其各位数字的立方
和,则这个数为水仙花数。编写一个程序,找出所有水仙花数。
def flower(number):
h=int(number/100)
t=int(number%100/10)
g=number%10
if (h**3+t**3+g**3)==number:
print(number)
for i in range(100,999):
flower(i)
或者:
def flower():
for i in range(100,999):
h=int(i/100)
t=int(i%100/10)
g=i%10
if (h**3+t**3+g**3)==i:
print(i)
2.编写一个函数findstr(),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数,假定输入的字符串为“You cannot improve your past,but you can improve your future.Once time is wasted,life is wasted.”,子字符串‘im’,函数执行后打印“子字符串在目标字符串中出现了3次”
利用字符串内置方法:count(sub,start,end)
def findstr(str1,substr):
num=str1.count(substr)
print(num)
print('子字符串在目标字符串中出现了'+str(num)+'次')
调用:
findstr('You cannot improve your past,but you can improve your future.Once time is wasted,life is wasted.','im')
以下为小甲鱼给出程序:
def findstr(str1,substr):
count=0
length=len(str1)
if substr not in str1:
print('在目标中未找到字符串!')
else:
for each1 in range(length-1):
if str1[each1]==substr[0]:
if str1[each1+1]==substr[1]:
count+=1
print('子字符串在目标字符串中出现了%d次'%count)
3.下边程序会输入什么?
def next():
print('我在next()函数里...')
pre()
def pre():
print('我在pre()函数里...')
next()
结果为:
我在next()函数里...
我在pre()函数里...
4.请问下面这个函数有返回值吗?
def hello():
print('hello fishC!')
如果没有用return 语句制定返回值,python也不是什么都不返回的,他会返回一个none对象,左右的python函数都是有返回值的
5.请问python的return函数可以返回多个不同类型的值吗?
可以的
def re():
return 3.14, '小孩','abc',4
结果为:
(3.14, '小孩', 'abc', 4)
6.目测一下程序会打印什么内容:
def fun(var):
var=1314
print(var,end='')
var=520
fun(var)
print(var)
打印:
1314
520
7.编写一个函数,判断传入的字符串参数是否为“回文联”(回文联即用会问形式写成的对联,即可顺读,也可倒读,例如:上海自来水来自海上)
def palindrome(string):
list1=list(string)
list2=reversed(list1)
if list1==list(list2):
return '是回文联!'
else:
return '不是回文联!'
8.编写一个函数,分别统计传入字符串参数(可能不止一个参数)的英文字符,空格,数字和其他字符的个数
def countnum(*paras):
length=len(paras)
eng_num=0
space_num=0
digit_num=0
str_num=0
for i in range(length-1):
for each in str(paras[i]):
if each.isalpha():
eng_num+=1
elif each==' ':
space_num+=1
elif each.isdigit():
digit_num+=1
else:
str_num+=1
print('英文字符个数:%d'%eng_num)
print('空格个数:%d'%space_num)
print('数字个数:%d'%digit_num)
print('其他字符个数:%d'%str_num)
countnum(3.16,'a bc~',5.6,'---')
结果为:
英文字符个数:3
空格个数:2
数字个数:5
其他字符个数:3
第20讲:
0.如果希望在函数中修改全局变量的值,应该使用什么关键字?
global关键字
count=4
def myfun():
global count
count=12
print(count)
结果为:12
1.在嵌套函数中,如果希望在内部函数修改外部函数的局部变量应该是用什么关键字?
nonlocal关键字
def fun1():
x=5
def fun2():
nonlocal x
x*=x
return x
return fun2()
结果为:25
2.python函数可以嵌套,但是注意访问的作用域的问题,请问下面代码存在什么问题?
def outside():
print('i am outside!')
def inside():
print('i am inside')
inside()
结果为:
inside()函数是outside()函数中的函数,作用域为outside()中,在外面是无法调用的
3.请问如何访问funin函数?
def funout():
def funin():
print('bingo,你成功访问到我了')
return funin()
直接利用funout()就可以访问了
4.请问如何访问funin函数呢?
def funout():
def funin():
print('bingo,你成功访问到我了')
return funin
funout()()进行访问
5.以下是‘闭包’的一个例子,请目测会打印什么内容?
def funx():
x=5
def funy():
nonlocal x
x+=1
return x
return funy
a=funx()
print(a())
print(a())
print(a())
结果为:
6,7,8