函数
基本概念
- 函数是Python为了代码最大程度的重用和最小化代码冗余而提供的基本程序结构
- 函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件
- 函数用于将相关功能打包并参数化
- 从定义函数的角度来说,我们平时会接触到的函数主要包括两类:
- 已经写好的,我们直接调用就可以了,如Python的内置函数
- 用户自行定义的函数,需要我们自己根据实际的要来定义
Python 定义函数必须使用def关键字,函数名自定义(函数名称的定义规范跟普通变量名一致),参数列表为传给此函数使用的参数,接着定义函数体
般格式如下:
def 函数名(参数列表):
函数体
函数名称的定义规范跟普通变量名一致
创建一个函数
def sum_num():
s = 1 + 10
print(s)
sum_num()
函数执行:
方式一:print(函数名)函数中只有return
方式二:函数名(函数中有print方法)
函数定义
定义函数时需要注意的几个点:
1、任何需要从外部传入的参数必须定义在函数名称后面的圆括号中。
2、函数的第一行语句可以选择性地使用文档字符串,用于函数注释。
3、函数体的内容必须缩进。当函数体的代码执行结束时,整个函数执行结束。
4、如果需要函数执行完后返回一个值给调用方,必须使用return语句来实现。当一个函数执行到return语句时,函数也将执行结束。(这个返回只用于需要返回值给调用方)
5、如果在函数执行过程中需要终止函数的执行,也可以使用return来强制结束。
函数调用
函数定义
def myFunc(name):
print("hello",",", name)
# 函数调用,输出hello,fanyun
myFunc("fanyun")
这里要注意一点,对于函数来说,定义函数是定义,调用函数是调用。一个函数必须先定义好之后才能调用,否则会报错
创建一个函数
def sum_num2():
s = 1 + 100
return s
print(sum_num2())
函数参数
参数的定义:参数在函数中相当于一个变量,而这个变量的值是在调用函数的时候被赋予的。在函数内部,你可以像过去使用变量一样使用它。
函数在什么时候应该定义参数? 定义函数时,有没有参数这个是要根据具体的情况来决定的。
根据用户输入的参数值,返回对应的运算结果
def get_result(a, b, op):
if op == '+':
return a + b
elif op == '-':
return a - b
elif op == '*':
return a * b
elif op =='/':
return a / b
else:
print('输入错误')
print(get_result(2,6,'+'))
函数练习题
1、创建一个函数,函数需要实现的功能是 打印99乘法表
def cfb_99():
for i in range(1,10):
for j in range(1,i+1):
print(f"{i}*{j}={i*j}\t",end="")
print()
print(cfb_99())
2、创建另一个函数,函数实现的功能是计算1+到100的和
def sum_qh():
bl = 0
for su in range(1,101):
bl += su
return bl
print(sum_qh())
函数参数
形参: 也叫形式参数,也就是在函数定义时,跟在函数名后面的括号内定义的参数。形参的主要作用是用于占位,形参的实际值是由调用函数时传递的实际参数决定的。
实参: 也叫实际参数,是指函数调用时在对应的形参位置传入的实际参数值。
#函数定义
def myFunc(name):
print("hello", ",", name)#name为形参
myFunc("woniu")#woniu为实参
创建一个函数,定义两个形参,进行运算操作
def yscz(a, b):
c= a + b
d = a - b
e = a * b
return c, d, e
print(yscz(1,2))
函数中参数指定位置传值
def 自定义函数名(参数1,参数2,参数3....):
函数体(函数下需要实现的功能)
调用函数名(参数1=xx,参数2=xx,参数3=xx)
函数参数-位置参数
位置参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
函数-不定长参数
-
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数。
-
和上述2种参数不同,声明时不会命名。
-
加了星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组。
def printinfo( argc,*vartuple ):
print ("This:")
print (argc)
for var in vartuple:
print (var)
return
printinfo(4)
printinfo( 7,'Woniuxy',20 )
-
除了能通过*args的形式传递元组类型的不定长参数外,还可以通过定义**kwargs来
传递字典类型的不定长参数。
def myfunc(*args, **kwargs):
print(type(kwargs))
for k, v in kwargs.items():
print(k, v)
# 方法1.直接通过键值对形式传入参数
myfunc(1,2,a='hello',b='world')
#方法2. 直接传入一个字典,但字典是一个整体,所以需要使用**来解包
dic = {'a': 'hello', 'b':'world'}
myfunc(1,2,**dic)
函数中参数的默认值
def 自定义函数名(参数1=默认值,参数2,参数3...):
函数体(函数下需要实现的功能)
调用函数名(参数1=xx值,参数2=xx,参数3=xx)
当函数中有默认值的时候,如果参数没有传值则只用默认值,传递了新的值则会使用新的值
创建带有参数的函数,并给参数赋默认值
def yscz2(a=100,b=100,f=10):
c = a+b+f
d = a-b-f
e = a*b/f
return c,d,e
# 给指定参数传值
print(yscz2(a=100,b=100,f=40))
函数参数-默认值参数
调用函数时,如果没有传递参数,则会使用默认参数。需要函数声明时指定默认值。
def add(a,b=10):
return a+b
print(add(4))
print(add(6,39))
函数变量作用域
Pvthon中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。
根据变量的作用域,函数中的变量可分为全局变量和局部变量。
函数内的变量需要为改变全局变量时,需要在函数内使用关键字global(global x)
创建一个函数并把函数中局部变量改为全局变量
def qjbl():
global zxzx
zxzx= 1+100+200
return zxzx
print(qjbl())
print(zxzx)
练习
1、求解1-100能被3和5同时整除的数字之和
s = 0
for i in range(1,101):
if i % 3 == 0 and i % 5 ==0:
s += i
print(s)
2、使用while,完成一下图形的输出
i = 0
while i <= 5:
print(i* "*")
i+= 1
3、for循环实现九九乘法表
def cfb_99():
for i in range(1,10):
for j in range(1,i+1):
print(f"{i}*{j}={i*j}\t", end = "")
print('\n')
cfb_99()
4、在1-100的数字序列中随机选择一个数作为目标数,每次游戏只能猜5次,
如果猜的结果大于目标数,则输出”大了,你还有X 次机会”
如果猜的结果小于目标数,则输出”小了,你还有X 次机会”
如果猜中了,则输出”你猜对了,只猜了X次,厉害!“退出游戏,并打印”游戏结束”
如果猜的次数用完,退出游戏并打印”次数已用完,欢迎下次再玩”。用循环实现。
import random
def guess_game():
target = random.randint(1,100)
count = 1 # 猜的次数
while count <= 5:
guess = int(input('请输入你猜的数字:'))
if guess == target:
print(f'你猜对了,只猜了{count}次,厉害!')
print("游戏结束")
break
elif guess > target:
print(f'大了,你还有{5-count}次机会')
elif guess < target:
print(f'小了,你还有{5-count}次机会')
count += 1
else:
print("次数已用完,欢迎下次再玩")
guess_game()
5、使用两个函数实现模拟一个注册登录的场景
用户注册时,需要输入账号和密码,保存账号与密码。
在登录时,我们去验证输入的账号与密码,是否是已经注册,已经注册提示已注册可以登陆,未注册提示无法登陆你未注册。
def Regist(user_name,pass_word):
global a
a = (user_name,pass_word)
c = a[0]
print(f'注册成功,账号是{c}')
Regist(user_name = input("请输入注册账号:"),pass_word=input("请输入注册密码"))
def Login(name,pwd):
b = (name,pwd)
if a[0] == b[0] and a[1] == b[1]:
print("已注册,登录成功")
elif a[0] == b[0] and a[1] != b[1]:
print("已注册,密码错误")
elif a[0] != b[0] and a[1] == b[1]:
print("已注册,账号错误")
else:
print("没有注册")
Login(name = input("请输入账号"),pwd = input("请输入密码"))
6、定义一个函数,接收任意个数的参数。这些参数类型包含我们学过的六种基本类型,假设每种参数类型里面都只包含数字(字典类型的话就是所有值都是数字),要求函数最后返回所有参数中的数字的和。
def sum_of_args(*args):
result = 0
for arg in args:
if isinstance(arg, (int,float)):
result += arg
elif isinstance(arg,(list, tuple, set)):
result += sum(arg)
elif isinstance(arg,(list, dict)):
result += sum(arg.values())
return result
print(sum_of_args(5,{1:1,2:2}))