在python中,编写程序时一般都会将其打包成一个函数,使用时只需拿来调用即可.
eg:之前所说过的copy其实就是定义的函数,而当需要copy时,只需调用copy函数
li = [1,2,3]
li.copy()
#如何定义一个函数
def 函数名():
函数体
定义一个函数后,在没有调用函数的情况下,函数是不会被执行的,执行的话必须调用
def zjs():
print('good boy')
zjs()
函数中可以嵌套函数
def zjs():
print('good boy')
def sjz():
print('bad boy')
sjz()
zjs()
定义函数时的变量称为形参,变量名可以任意起
调用函数时的参数成为实参,该参数必须是实际存在的
def fun(a):
print('hello %s' %(a))
fun(123)
fun('python')
函数的练习1
编写一个名为collatz()的函数,它有一个名为number的参数。
如果参数是偶数,那么collatz()就打印出number//2
如果number是奇数,collatz()就打印3*number+1
def collatz(number):
if number % 2 == 0:
print(number // 2)
else:
print(3 * number + 1)
collatz(2) #取number=2测试
函数动态添加和删除成员
def fun():
print(fun.x)
fun()
# 动态添加
fun.x = 3
fun()
# 动态删除
del fun.x
fun()
函数的返回值
函数调用时一般有返回值,没有定义返回值的时候,python中默认返回None
def hello():
print('hello')
res = hello()
print(res)
结果如下:
返回时return的作用
def hello():
# return 返回的表达式或者变量
return 'good'
res = hello()
print(res)
结果如下:
return的应用练习
随机生成20个学生的成绩
判断这个20个学生的等级
import random
def level(scores):
if 90 < scores <= 100:
return 'A'
elif 80 < scores <= 90:
return 'B'
else:
return 'C'
def main():
for i in range(20):
score=random.randint(1,100)
print('成绩为%s,等级为%s' %(score,level(score)))
main()
测试结果如下:
##多个返回值
def fun(a):
# 接收一个列表,求这个列表的最大值,平均值,最小值
max_num = max(a)
min_num = min(a)
avg_num = sum(a)/len(a)
# python函数中,只能返回一个值
# 如果非要返回多个值,会把返回的值封装为一个元组数据类型
return max_num,min_num,avg_num
t = fun([34,1,2,3,4,5,6,7,421])
print(t,type(t))
函数形参之四大参数类型
参数:形参 实参
形参的分类:位置参数 默认参数 可变参数 关键字参数
位置参数
#位置参数:形参和实参必须保持一致
def info(name,age):
print(name,age)
info('sjz',21)
默认参数
#默认参数:形参和实参可以不一致
def mypow(x,y=2):
"""
求x的y次方
:param x:
:param y:
:return:
"""
print(x**y)
mypow(4)
mypow(4,3)
可变参数
#可变参数
def mySum(*args):
"""
需求:用户可以传递任意的值,计算数值的和
*args:是一个可变参数
args:是元组的数据类型
:return:
"""
# print(args)
sum = 0
for i in args:
sum += i
print(sum)
mySum(1,2,4,6,9,11)
关键字参数
#关键字参数
def stuinfo(name,age,**kwargs):
print(name,age)
print(kwargs)
stuinfo('sjz',21,hobbies=['running','listen music'],gender='male')
函数练习_平方等式
题目需求:
对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
f(13) = 12 + 32 = 10
f(207) = 22 + 02 + 72 = 53
下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b,
且k*f(n)=n
输入:
第一行包含3个正整数k,a, b, k>=1, a,b<=1018, a<=b;
输出:
输出对应的答案;
范例:
输入: 51 5000 10000
输出: 3
def f(n):
# 1.先把数字转换成字符串
n = str(n)
# 2.计算字符串中每个数的平方
sum = 0
for i in n:
sum += int(i) ** 2
return sum
def isOK(k,n):
if k * f(n) == n:
return True
else:
return False
def main():
k = 51
a = 5000
b = 10000
count = 0
for item in range(a,b+1):
if isOK(k,item):
count += 1
print(count)
main()
测试后输出为3
函数的作用域
作用域
局部作用域
全局作用域
# 全局作用域:作用于整个程序
num = 10
print('out fun: id=',id(num))
def fun():
#局部作用域,在函数运行时生效,函数运行结束则释放
num =2
print('in fun:id=',id(num))
print('in fun:num = %s' %(num))
fun()
print('out fun: num=%s' %(num))
测试结果如下:
如何将局部变量变为全局变量
num = 10
def fun():
# 通过global关键字声明局部变量为全局变量
# 函数执行完毕,变量依然生效
global num
num = 2
fun()
此时测试输出结果:
如图,通过global函数将局部变量变为全局变量后,调用函数后发现是我们改变的变量作用于函数
函数练习02
1.Collatz序列
编写一个名为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(0)
elif number % 2 == 0:
return number // 2
else:
return 3 * number + 1
num = int(input('输入数字:'))
while True:
num = collatz(num)
print(num)
输出结果如下:
##参数检测
def add(a, b):
if isinstance(a, (int, float)) and isinstance(b, (int, float)):
return a + b
else:
print('输入有错')
return 'sorry'
res = add(3.5,2)
print(res)
res1 = add('sjz',2)
print(res1)
res2 = add('3.5',2)
print(res2)
测试结果如下:
参数检测练习
def rate(letter1,letter2):
if not (isinstance(letter1,str)) and (isinstance(letter2,str)):
print('cannot recognize')
return
if len(letter1) < len(letter2):
print('sorry')
return
right= 0
for letter1_char,letter2_char in zip(letter1,letter2):
if letter1_char == letter2_char:
right+=1
return right/len(letter1)
a = 'i love study'
b = 'I love study'
print(rate(a,b))
输入结果如下: