函数
# 1. 无参数的函数;
# # 定义函数, 并不会执行;
# def hello():
# # 函数体
# print("hello")
# # 调用函数
# hello()
# 2. 带有参数的函数
def fun1(name):
# name = "fentiao"
# 定义函数时的变量称为形式参数, 变量名可以任意起;
print("hello %s" %(name))
fun1("fendai") # 调用函数时的参数称为实参, 该参数必须是实际存在的;
# 函数调用时一般有返回值;没有返回值时, python中默认返回None;
def hello():
print("hello")
res = hello()
print(res)
return的作用
import random
def get_level(score):
if 90 < score <= 100:
return 'A'
elif 80 < score <= 90:
return 'B'
else:
return 'C'
def main():
for i in range(20):
score = random.randint(1,100)
print("成绩为%s, 等级为%s" %(score,get_level(score)))
main()
返回值有多个
def fun(a): # a = [34, 1, 2, 3, 4, 5, 6, 7, 2378]
# 我接收一个列表, 求这个列表的最大值,平均值, 最小值;
max_num = max(a)
min_num = min(a)
avg_num = sum(a)/len(a)
# python函数中, 只能返回一个值;
# 如果非要返回多个值, 会把返回的值封装为一个元组数据类型;
return max_num, avg_num, min_num
variables = fun([34, 1, 2, 3, 4, 5, 6, 7, 2378])
print(variables, type(variables))
函数参数
# 形参--必选参数
def add(x, y, z): # x=1, y=2
return x + y + z
print(add(2,3,4))
# 形参--默认参数
def mypow(x, y=2):
return x ** y
print(mypow(2))
# 形参--可变参数
# 可变参数, *变量名;
# *args, args实质是一个元组;
def mySum(*args):
print(args, type(args))
return sum(args)
print(mySum(1,2,3,4,5))
# 如果已经存在;列表, 但是要把列表的每一个元素作为参数, 可以直接*li进行解包;
li = {1,2,3}
print(mySum(*li))
# 形参--关键字参数
# **kwargs关键字参数; 接收的kwargs是字典类型;
def fun(**kwargs):
print(kwargs, type(kwargs))
fun(a=1, b=2)
# d = {
# 'a':1,
# 'b':2
# }
#
# fun(**d) # a=1,b=2
# <div id="s_tab" width=100px height=200px>网页</div>
def make_html(label, value, **kwargs):
s = ""
for k,v in kwargs.items():
s += " %s=%s" %(k,v)
html = "<%s %s>%s</%s>" %(label, s, value, label)
return html
print(make_html("div", "网页",id="s_tab",width=100, height=200))
#函数练习--平方等式
题目需求:
对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
f(13) = 1**2 + 3**2 = 10
f(207) = 2**2 + 0**2 + 7**2 = 53
下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b,
且k*f(n)=n
输入:
第一行包含3个正整数k,a, b, k>=1, a,b<=10**18, a<=b;
输出:
输出对应的答案;
范例:
输入: 51 5000 10000
输出: 3
def f(n):
res = 0
for item in str(n):
res += int(item) ** 2
return res
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 i in range(a, b + 1):
if isOk(k, i):
count += 1
print(count)
main()
函数的作用域
# 作用域:
# 局部作用域:
# 全局作用域
# 全局作用域:作用于整个脚本
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))
"""
out fun: id= 505537440
in fun: id= 505537312
in fun: num = 2
out fun: num =10
"""
global关键字
num = 10
def fun():
# 通过global关键字声明局部变量为全局变量, 让函数执行完, 2依旧生效;
global num
num = 2
fun()
print(num)
函数练习–Collatz序列
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('Num:'))
while True:
num = collatz(num)
print(num)
函数参数的顺序
必选,> 默认,> 可变,> 关键字
定义函数,默认参数的默认值尽量不是可变参数
def fun(li=[]):
li.append("hello")
return li
print(fun())
print(fun())
结果如下:
['hello']
['hello', 'hello']