如何定义一个函数
def hello():
print('hello')
print('world')
hello() 通过函数名调用函数
实验效果
hello
world
函数里面嵌套函数
def lucky():
print('is girl')
def boy(): 在上面的函数里面在嵌套一个函数
print('is boy')
boy() 先用一个函数名调用一个函数,接着可以再次调用
lucky()
实验效果
is girl
is boy
参数:形参 实参
- 定义函数的时候的变量,叫形参(形参可以任意起名)
- 调用函数的时候传递的参数叫实参,有真实的数据信息
def welcome(a): 定义函数时候提供的就是形参了
print('hello',a)
welcome('tom') 而这里的tom 传递了实际的参数,真是的信息
形参
位置参数:形参和实参必须保持一致,按照位置传参数
def Info(name,age):
print(name,age)
Info('bbo',20) 这种情况一般的是可以识别的
但是更推荐下边这种
Info(name='bbo',age=20) 因为计算机是不知道你所需要传的参数是往那个地方传的,这样是可以更准确的传参
实验效果
bbo 20
默认参数
def decik(x,y=2):
print(x**y)
decik(2,3) 指定实参
decik(4) 这里只默认上传了一个 参数默认的是2,
实验效果
8
16
可变参数
* 主要使用在函数参数中,在定义函数中添加是为了在调用该函数时直接将多个参数转换成一个元组,而在调用函数时参数添加 *,是为了将列表或者元组转化成多个参数。
def sums(*a):
print(*a)
print(a)
api = 0
for i in a:
api += i
print(api)
nums = [1,2,4,5]
nums1=(5,6,7,8)
nums2={2,3,4,5}
#参数解包,在参数名前加*
print(*nums)
print(*nums1)
print(*nums2)
实验效果
1 2 4 5
5 6 7 8
2 3 4 5
关键字参数
**也主要使用在函数参数中,在定义函数中添加是为了在调用该函数时可以添加任意一个键值对转出一个字典,而在调用函数时在列表中添加 **,是为了将字典转化成多个参数
*k:是一个字典,可以传递任意多的key-value
def func(name,age,**k):
print(name)
print(age)
print(k)
d = dict(a=1,b=2)
print(*d) 对字典进行解包,一个星号,获取所有的key值
实验效果
a b
##如果是不对字典解包的,可以直接
##print(d)
实验效果如下
{'a': 1, 'b': 2} 直接分解出的就是字典
def func(name,age,**k): 这里的**k在函数中意思就是可以转出字典
print(name)
print(age)
print(k)
func('lucky',20,c=99)
实验效果
lucky
20
{'c': 99}
函数的返回值
返回值:函数运算的结果,还需要进一步操作,给函数一个返回值
return用来返回函数执行的结果,如果函数没有返回值,默认返回None
一旦遇到return 函数执行结束,后面的代码不会执行
多个返回值的时候,python会帮我们封装成一个元组类型
def pow(x,y=2):
return x**y,x+y
print('@@@@@')
a = pow(5) 在这里默认赋值是给x 赋值
print(a)
print(pow(6)) 打印的也是默认给x 赋值
实验效果
@@@@@
(25, 7)
(36, 8)
作用域
局部变量:在函数内部定义的变量,只在函数内部起作用,函数执行结束后,变量会自动删除
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中
a = 1
print('outside:',id(a))
def func():
global a
a = 4
print('inside:',id(a))
func()
print(a)
print(id(a))
实验效果
outside: 9322464
inside: 9322560
4
9322560
编写一个函数cacluate, 可以接收任意多个数,返回的是一个元组.
元组的第一个值为所有参数的平均值, 第二个值是大于平均值的所有数.
def cacluate(*args):
sum = 0
k = 0
for i in args:
sum +=i
k +=1
aver=sum/k
list=[]
for i in args:
if i>aver:
list.append(i)
return (aver,list)
a = cacluate(2,3,4,6,7,1,9)
print(a)
编写一个函数, 接收字符串参数, 返回一个元组,‘ehllo WROLD’
元组的第一个值为大写字母的个数, 第二个值为小写字母个数.
def anyway(args):
low=0
upp=0
for ade in args:
if str(ade).isupper():
upp+=1
elif str(ade).islower():
low+=1
return upp,low
print(anyway('ehllo WORLD'))
编写函数, 接收一个列表(包含30个整形数)和一个整形数k, 返回一个新列表.
函数需求:
将列表下标k之前对应(不包含k)的元素逆序;
- 将下标k及之后的元素逆序;
[1,2,3,4,5] 2 [2,1,5,4,3]
def func(alist,k):
if k<0 or k>len(alist):
return 'error key'
return alist[:k][::-1] + alist[k:][::-1]
print(func([1,2,3,4,5],2))
实验效果
[2, 1, 5, 4, 3]
编写一个名为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 True:
num =collatz(num)
print(num)
实验效果
Num:3
10
5
16
8
4
2
1
题目:两个乒乓球队进行比赛,各出三人。
甲队为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 !=k and m !=i :
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
模拟轮盘抽奖游戏
轮盘分为三部分: 一等奖, 二等奖和三等奖;
#轮盘转的时候是随机的,
###如果范围在[0,0.08)之间,代表一等奖,
###如果范围在[0.08,0.3)之间,代表2等奖,
###如果范围在[0.3, 1.0)之间,代表3等奖,
###模拟本次活动1000人参加, 模拟游戏时需要准备各等级奖品的个数.
import random
def gift():
tomcat = float(random.randint(0,101)/100)
return tomcat
list= [0,0,0]
for i in range(1000):
if 0.08> gift()>=0:
list[0] +=1
elif 0.3>gift()>=0.08:
list[1] +=1
else:
list[2] +=1
print(list)
效果演示
[79, 205, 716] 分别为一二三等奖