一.函数的定义
1.定义一个函数
当函数不调用时,此函数不会执行
def hello(): ##无结果输出
print('hello')
print('python')
2.函数的调用-以函数名调用函数
def hello():
print('hello')
print('python')
hello() ##函数名调用函数
hello
python
3.函数里面的嵌套函数
def westos():
print('is westos')
def python():
print('is python')
python()
westos()
is westos
is python
4.函数的形参与实参
定义函数时的变量叫形参,可以任意的起名
调用函数时,传递的参数叫实参为真实的数据信息
def welcome(a): ##a为形参
print('hello',a)
welcome('tom') ##‘tom'为实参
welcome('luck')
hello tom
hello luck
二.函数的形参分类
形参包括位置参数、默认参数、可变参数、关键字参数
1.位置参数:形参与是参的位置必须保持一致
def getInfo(name,age):
print(name,age)
getInfo('westos',18)
getInfo(11,'luck') ##位置不一致
getInfo(age=11,name='luck') ##给形参赋值,不须在意位置
westos 18
11 luck ##输出错误
luck 11
2.默认参数 形参与实参可以不一致
def mypow(x,y=2): ##默认函数中形参y的值为2
print(x**y)
mypow(2,3) ##当输出两个实参,按输出的两实参计算
mypow(4) ##当仅输出一个实参,则另一个实参按默认的来计算
8
16
3.可变参数
def mysum(*a):
print(*a)
print(a)
sum = 0
for item in a:
sum+=item
print(sum)
nums=[1,2,4,5]
nums1=(1,2,3,4)
nums2={1,2,3,4}
mysum(*nums)
mysum(*nums1)
mysum(*nums2)
1 2 4 5
(1, 2, 4, 5)
12
1 2 3 4
(1, 2, 3, 4)
10
1 2 3 4
(1, 2, 3, 4)
10
4.关键字参数
def getStuInfo(name,age,**k): ##*k是一个字典,可以任意传递多个key-value值
print(name)
print(age)
print(k)
d = dict(a=1,b=2)
print(*d) ##对字典进行解包,一个*可以获取所有的key值
getStuInfo('westos',11,a=1,b=2)
a b ##key值
westos ##name
11 ##age
{'a': 1, 'b': 2} ##*k
三.函数的返回值及作用域
1.函数的返回值
函数运算的结果,还需要进一步操作,给函数一个返回值
return用来返回函数执行的结果,如果函数没有返回值,默认返回None
一旦遇到return 函数执行结束,后面的代码不会执行
多个返回值的时候,python会帮我们封装成一个元组类型
def mypow(x,y=2):
print(x**y)
return x**y,x+y
print('!!!') ##return后的代码不执行
a = mypow(4)
print(a)
print(mypow(5))
16
(16, 6)
25
(25, 7)
2.函数的作用域
局部变量:在函数内部定义的变量,只在函数内部起作用,函数执行结束后,变量会自动删除
a = 1
print('outside:',id(a))
def fun():
a = 5 ##函数内部定义的变量
print('inside:',id(a))
fun()
print(a)
print(id(a))
outside: 9326560
inside: 9326688 ##内部定义的变量仅在函数内部起作用
1
9326560
当定义a为全局变量时
a = 1
print('outside:',id(a))
def fun():
global a ##定义a为全局变量
a = 5
print('inside:',id(a))
fun()
print(a)
print(id(a))
outside: 9326560
inside: 9326688 ##函数内的变量作用于整个过程不会被删除
5
9326688
四.习题
1.编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组。元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数。
def cacluate(*a):
sum = 0
list = []
for i in a:
sum+=i
average = sum/len(a)
for k in a:
if k > average:
list.append(k)
return (average,list)
a = cacluate(3,5,2,6)
print(a)
(4.0, [5, 6])
2.编写一个函数, 接收字符串参数, 返回一个元组,‘ehllo WROLD’。 元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
def word(a):
big = 0
small = 0
for i in a:
if i.isupper():
big+=1
elif i.islower():
small+=1
return(big,small)
b = word('ehllo WROLD')
print(b)
(5, 5)
3.编写函数, 接收一个列表(包含30个整形数)和一个整形数k, 返回一个新列表.
函数需求:将列表下标k之前对应(不包含k)的元素逆序;将下标k及之后的元素逆序;
例如:[1,2,3,4,5] 2 [2,1,5,4,3]
def func(list,k):
nlist=[]
if k < 0 or k > len(list):
return 'Error'
else:
nlist.extend(list[:k][::-1]+list[k:][::-1])
return nlist
a = func([1,2,5,3],2)
print(a)
[2, 1, 3, 5]
4.编写一个名为collatz()的函数,它有一个名为number的参数。如果参数是偶数,那么collatz()就打印出number//2,并返回该值。如果number是奇数,collatz()就打印并返回3*number+1。然后编写一个程序,让用户输入一个整数,并不断对这个数调用collatz(),直到函数返回值1(令人惊奇的是,这个序列对于任何整数都有效,利用这个序列,你迟早会得到1!既使数学家也不能确定为什么。你的程序在研究所谓的“Collatz序列”,
它有时候被称为“最简单的、不可能的数学问题”)。
输入:
3
输出:
10
5
16
8
4
2
1
def collatz(number):
if number == 1:
exit()
elif number%2 == 0:
return number//2
else:
return 3*number+1
num = int(input('NUM:'))
while num>1:
num = collatz(num)
print(num)
结果测试
NUM:3
10
5
16
8
4
2
1
5.两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
team = ['x','y','z']
all_order = []
for i in team:
for k in team:
if k != i:
for m in team:
if m != i and m != k:
all_order.append([i,k,m])
for t in all_order:
if t[0] != team[0] and t[2] != team[0] and t[2] != team[2]:
print('a<---> %s,b<---> %s,c<---> %s' %(t[0],t[1],t[2]))
结果演示:
a<---> z,b<---> x,c<---> y
6.模拟轮盘抽奖游戏,轮盘分为三部分: 一等奖, 二等奖和三等奖;轮盘转的时候是随机的,如果范围在[0,0.08)之间,代表一等奖;如果范围在[0.08,0.3)之间,代表2等奖;如果范围在[0.3, 1.0)之间,代表3等奖。
模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.
import random
dict={
'一等奖':(0,0.08),
'二等奖':(0.08,0.3),
'三等奖':(0.3,1.0)
}
def dict_fun():
number = random.random() ##获取0-1的随机数
for k,v in dict.items(): ##判断转盘是几等奖
if v[0]<=number<=v[1]:
return k
result = {} ##定义新字典,用来存储应设的奖品等级的个数
for i in range(1000):
res=dict_fun() ##定义key值
if res not in result: ##key值不在新字典里
result[res]=1 ##对应的value值=1
else: ##key值在新字典里
result[res]+=1 ##对应的value值+1
for k,v in result.items():
print(k,'------',v)
三等奖 ------ 682
二等奖 ------ 239
一等奖 ------ 79