函数的引入,函数的定义,定义的三种形式,函数的调用,函数的返回值,函数的参数,.可变长参数,return 返回值。

1.函数的引入

如果现在有一个需求需要实现用户登录注册的功能,我们该怎么实现呢?

def register():
    """注册功能"""
    count = 0
    while count < 3:
        username_inp = input('请输入你的用户名:')
        pwd_inp = input('请输入你的密码:')
        re_pwd_inp = input('请在此输入你的密码:')

        if not pwd_inp == re_pwd_inp:
            print('两次密码输入不一致')
            count += 1
            continue
        with open('user_info.txt', 'a', encoding='utf8') as fa:
            fa.write(f'{username_inp}:{pwd_inp}
')  # :表示用户名和密码的分割;|用户和用户之间的分割
            fa.flush()
            break

def login():
    """登录功能"""
    # 登录
    username_inp = input('请输入你的用户名:')
    pwd_inp = input('请输入你的密码:')

    with open('user_info.txt', 'r', encoding='utf8') as fr:
        for user_info in fr:
            username, pwd = user_info.split(':')

            if username.strip() == username_inp and pwd.strip() == pwd_inp:  # strip可以去掉两端的换行符
                print('登录成功')
                break
            # else:
            #     continue  # continue一般不写在最后一行
        else:
            print('登录失败')

# register()
# login()

函数不会改变某一个功能的代码,它只做了一件事情--》封装(接口),只会让你的代码更加简洁而已.(写入计算机)

def caculator():
    num1 = input('请输入一个数字')
    num1 = int(num1)
    sig = input('请输入一个符号')
    num2 = input('请输入另一个数字')
    num2 = int(num2)

    if sig == '-':
        print(num1 - num2)
    elif sig == '+':
        print(num1 + num2)
    elif sig == '*':
        print(num1 * num2)
    elif sig == '/':
        print(num1 / num2)
    else:
        print('傻逼,我不认识')

caculator()

2.函数的定义

函数:表示一种工具。

定义函数:实用工具之前 --》 必须得造一个工具。

函数的定义功能 : 包裹一部分代码,实现某一个功能,达成某一个目的

函数的基本格式:

# 函数的定义
def 函数名(等同于变量名)():
#     """对函数(工具)的描述信息"""
#     代码块
def 函数名():
    """描述的信息"""
	code1.. 
	code2..

# 函数的调用
函数名()

def guess():
    """给定两个数,打印较大的数"""
    x = 30
    y = 20

    if x > y:
        print(x)
    else:
#函数定义的特性: 函数定义过程,只检测语法,不执行代码。

# 函数的定义处
def func():
    print(123)
    
# 函数的调用处
func()   # 调用阶段,会执行代码

函数的定义:和函数的调用。

# 函数的定义 
#def 函数名(等同于变量名)():
#     """对函数(工具)的描述信息"""
#     代码块
def chengfabiao():
    """描述的信息"""
    for i in range(1, 10):
        for j in range(1, i + 1):
            print("%d*%d=%2d " % (i, j, i * j), end="")
        print()
        
# 函数的调用
chengfabiao()
chengfabiao()
chengfabiao()
#结果:
1*1= 1 
2*1= 2 2*2= 4 
3*1= 3 3*2= 6 3*3= 9 
4*1= 4 4*2= 8 4*3=12 4*4=16 
5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 
6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

# ### 水平翻转乘法表
# 函数的定义处
def chengfabiao_99():
    for i in range(1, 10):
        # 循环空格
        for k in range(9 - i, 0, -1):  # 8 ~ 1
            print("       ", end="")

        # 循环表达式
        for j in range(1, i + 1):
            print("%d*%d=%2d " % (i, j, i * j), end="")
        print()


# 函数的调用处
chengfabiao_99()

# 要打印10次
for i in range(10):
    # 函数的调用处
    chengfabiao_99()
    
#结果:                                                  1*1= 1 
                                                 2*1= 2 2*2= 4 
                                          3*1= 3 3*2= 6 3*3= 9 
                                   4*1= 4 4*2= 8 4*3=12 4*4=16 
                            5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 
                     6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
              7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
       8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 

3.定义的三种形式。

3.1无参函数:

定义函数时参数是函数体接收外部传值的一种媒介,其实就是一个变量名

在函数阶段括号内没有参数,称为无参函数。需要注意的是:定义时无参,意味着调用时也无需传入参数。

如果函数体代码逻辑不需要依赖外部传入的值,必须得定义成无参函数。

def func():
    print('hello oldboy')
    
func()  # hello oldboy

3.2有参函数

在函数定义阶段括号内有参数,称为有参函数。需要注意的是:定义时有参,意味着调用时也必须传入参数。

如果函数体代码逻辑需要依赖外部传入的值,必须得定义成有参函数。

def sum_self(x, y):
    """求和"""
    res = x+y
    print(res)

sum_self(1,2)  # 3

3.3空函数

当你只知道你需要实现某个功能,但不知道该如何用代码实现时,你可以暂时写个空函数,然后先实现其他的功能。

空函数  待输入
def func():
    pass 
def register():
    pass
def login():
    pass

4.函数的调用。

4.1什么是函数调用?

第一次讲函数其实就讲了函数的调用,但是你不得不再次更新你对函数调用的对象。

函数名(...)即调用函数,会执行函数体代码,直到碰到return或者执行完函数体内所有代码结束。

函数运行完毕所有代码,如果函数体不写return,则会返回None。

def func()
	pass
print(func())

4.2为何用调用函数

使用函数的功能。

4.3 函数调用的三种形式

def max_self(w,q):
    if w>q:
        return w
    else:
        return q
    
# 1.
max_self(1,2)
# 2.
res = max_self(1,2)*12
# 3.
max_self(max_self(20000,30000),40000)

5.函数的返回值。

# return的特性:
# 1. return 返回一个返回值,如果没有返回值,返回None
# 2. 没有return 默认返回None
# 3. return 会终止函数,不运行下面的代码,假设有多个return的时候,运行到第一个就会结束,不会运行第二个
# 4. return 通过逗号隔开,可以返回多个值,返回值以元组的形式接收
. 0个 : 返回None
。 1个 : 返回值是该值本身。
。 多个:返回值是元素。

什么是返回值:函数内部代码经过一些列逻辑处理获得的结果。

def = func():
	name = "liangjing"
	resurn name
name = func()
print(name)  #liangjing

为什么要返回值?

#为什么要返回值。
def shu (count_w,total_q):
    if count_w > total_q:
        return (count_w)
    else:
        return (total_q)
shuzhi = shu(123,150)
print(shuzhi*2)  #300
# 函数返回多个值
def func():
    name = "liangjing"
    age = 20
    hobby_list = ["听歌","睡觉","购物"]
    return  name ,age , hobby_list
name,age,hobby_list = func()
print(f"name,age,hobby_list:{name,age,hobby_list}")

6.函数的参数

一 .形参和实参

6.1 形参:

在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名。

def func(x, y):
    print(x)
    print(y)

二 实参

在函数调用阶段括号内传入的参数,称之为实际参数,简称实参,本质就是变量的值。

func(1, 2)
6.2 .位置参数

在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置形参。

def func(x, y):
    print(x)
    print(y)

特点:按照位置定义的形参,都必须被传值,多一个不行,少一个也不行。

6.3 位置实参

在函数调用阶段,按照从左到右的顺序依次定义的实参,称之为位置实参。

func(1, 2)

三 .默认形参

在定义阶段,就已经被赋值。

def func(x, y=10):
    print(x)
    print(y)
    
func(2)
特点:在定义阶段就已经被赋值,意味着在调用时可以不用为其赋值。

注意:

位置形参必须放在默认形参的左边。
默认形参的值只在定义阶段赋值一次,也就是说默认参数的值在函数定义阶段就已经固定了。
m = 10


def foo(x=m):
    print(x)


m = 111
foo()  # 10
默认参数的值通常应该是不可变类型。
# 演示形参是可变类型
def register(name, hobby, hobby_list=[]):
    hobby_list.append(hobby)
    print(f"{name} prefer {hobby}'")
    print(f"{name} prefer {hobby_list}")


register('nick', 'read')
register('tank', 'zuipao')
register('jason', 'piao')
nick prefer read'
nick prefer ['read']
tank prefer zuipao'
tank prefer ['read', 'zuipao']
jason prefer piao'
jason prefer ['read', 'zuipao', 'piao']
# 修改形参是可变类型代码
def register(name, hobby, hobby_list=None):
    if hobby_list is None:
        hobby_list = []
    hobby_list.append(hobby)
    print(f"{name} prefer {hobby}'")
    print(f"{name} prefer {hobby_list}")


register('nick', 'read')
register('tank', 'zuipao')
register('jason', 'piao')
nick prefer read'
nick prefer ['read']
tank prefer zuipao'
tank prefer ['zuipao']
jason prefer piao'
jason prefer ['piao']
6.4普通形参(位置)
# 函数的定义处  hang , lie 是普通形参,在函数的定义处
def small_star(hang,lie):
	i = 0
	while i<hang:
		j = 0
		while j<lie:
			print("*",end="")
			j+=1
		print()
		i+=1
# 函数的调用处  => 形参实参 一 一 匹配
small_star(10,10)  # 十行十列
small_star(8,80)   # 八行八十列
# 注:普通形参 必须放到 默认形参 的前面
6.5 默认形参 在一开始的时候就赋予默认值,在调用没给实参时,使用参数默认值
"""
如果没有给实际参数,使用自己的默认值
如果给与实际参数,使用实际值
"""
def small_star(hang=10,lie=10):
	i = 0
	while i<hang:
		j = 0
		while j<lie:
			print("*",end="")
			j+=1
		print()
		i+=1
# 函数的调用处
small_star()
small_star(5,9) # 5 9实际参数
print("<=====>")
# 3被hang收走了,lie使用了默认值 10,形参实参一一匹配
small_star(3)   # 3 实际参数
6.6普通收集参数
'''
在参数的前面加上一个星星,这样的参数叫做普通收集参数
作用:专门用来收集那些,多余的没人要的  普通实参(即 实参 多余 形参 的普通实参部分,打包成一个 元组)
普通收集参数:
    def func(*args):
        pass
'''
# 函数的定义处
def func(a,b,c,d,*args):
	print(a,b,c,d) # 1 2 3 4
	print(args)    # (5, 6, 7)	元组
# 函数的调用处
func(1,2,3,4,5,6,7)

关键字收集参数

'''
在参数的前面加上二个星星,这样的参数叫做关键字收集参数
作用:专门用来收集那些,多余的没人要的  关键字实参(即 实参 多余 形参 的关键字实参部分,打包成一个 字典)
关键字收集参数:
    def func(**kwargs):
        pass
'''
# 函数的定义处
def func(a,b,c,**kwargs):
	print(a,b,c)
	print(kwargs) 
# 函数的调用处
func(1,2,3,dd=4,ff=5,zz=6)   # kwargs = {'dd': 4, 'ff': 5, 'zz': 6}	
func(a=1,b=2,c=3,pp=90)      # kwargs = {'pp': 90}
6.7关键实参

普通实参

  • 普通实参 必须放到 关键字实参 前面
"""
(1) 关键字实参在进行调用时,顺序可以任意
(2) 如果定义时是普通形参,调用时用的关键字实参,那么这个形参后面的所有参数都必须使用关键字实参;
    因为普通形参 必须放到 默认形参的前面,而且要一一匹配,所以后面必须跟关键字实参
"""
def small_start(hang,a,b,c,lie = 10):
	i = 0
	while i<hang:
		j = 0
		while j<lie:
			print("*",end="")
			j+=1
		print()
		i+=1
# 关键字实参
# small_start(hang=3,lie=8)
# small_start(lie=8,hang=3)
# small_start(hang = 3,a=4,b=5,c=6)
small_start(lie=90,b=5,a=4,hang = 3,c=6)

区分默认形参和关键字实参:

"""
总结:
	默认形参 和 关键字实参 在写法上一模一样
	只不过,一个是在函数的定义处,一个是在函数的调用处;
"""
6.8 总结
实参的应用:取决于个人习惯
形参的应用:

大多数情况的调用值一样,就应该将该参数定义成位置形参
大多数情况的调用值一样,就应该将该参数定义成默认形参

7.可变长参数

  • 和 ** 的魔术用法

    """
    在函数的定义处,*和**用来接收打包,* 打包成一个 元组, ** 会打包成一个 字典
    在函数的调用处,*和**用来解包,*应用在列表或者元组,**应用在 字典
    """
    
def func(a,b,*,c,d):
	print(a,b)
	print(c,d)

lst = [10,11]
''' *lst 相当于把列表中的每一个元素单独拿出来,扔到参数中进行赋值;'''
func(*lst,c=12,d=13) # func(10,11,c=12,d=13)
  • **

    def func(a,b,*,c,d):
    	print(a,b)
    	print(c,d)
    dic = {"c":12,"d":13}
    ''' **dic 相当于把字典当中每一个元素变成 c=12,d=13 的形式传入关键字实参 '''
    func(10,11,**dic) #func(10,11,c=12,d=13)
    
  • 终极形态

    func(*lst,**dic)      #  用于解包容器类型数据,然后将解包后的数据传入实参处,要与形参一一匹配
    def func(*args,**kwargs):     # 可以收到所有的参数,用在形参处
    

return 返回值

"""
可以自定义函数的返回值;return 是把这个值 返回到函数的调用处(打印此函数才能得到返回值)
(1) return 返回值 后面除了可以接6大标准数据类型之外,还可以返回函数和类对象,如果不定义返回值,默认返回None
(2) 在函数中,如果执行了return 返回值,意味着函数立刻终止,后面的代码不执行
"""
# return的作用:将函数执行结果返回给调用处程序,然后可以用来保存进行再计算等。return 旨在立即中断控制流并退出当前函数,将指定值返回给调用函数的调用者
  • 可以返回的类型 6大标准数据类型 / 函数和类对象
# 函数的定义处
def func():
	# return 19
	# return 8.19
	# return True
	# pass
	# return 6+7j
	# return "你好"
	# return [1,2,3]
	return {"a":1,"b":2}
# 函数的调用处
res = func()  # 此时函数func()已调用
print(res)
  • 遇到 return 后,意味着函数终止,后面的代码不再执行
# 模拟一个计算器 + -  * /
def calc(sign,num1,num2):
	if sign == "+":
		res = num1+num2	
	elif sign == "-":
		res = num1 - num2	
	elif sign == "*":
		res = num1 * num2		
	elif sign == "/":
		if num2 == 0:
			return "除数不能为0"
		res = num1 / num2
	else:
		return "对不起,这个我不会算!"
	# print(res)
	return res
res = calc("/",10,20)
print(res)  # 打印该函数的返回值

原文地址:https://www.cnblogs.com/WQ577098649/p/11552396.html