漫天飞雪

函数(一)

函数

函数的基础

什么是函数

在程序中,函数就是具备某一功能的工具

函数解决的问题

  • 程序冗长
  • 程序的扩张性
  • 程序的可读性

如何使用函数

先定义后调用,定义只检测语法,调用执行函数体

def 函数名(param1.param2)
函数功能描述
param1:描述
return()

调用函数

函数名(param1)

注册功能函数

def register()
	username=input('username: ').strip()
	pwd=input('password ').strip()
	with open('','a',encoding='utf8') as fa:
	fa.write(f'{username}:{pwd}\n')
	fa.flush()
register()
	

登录功函数

ef login():
	inp_username = input('username: ').strip()
	inp_pwd = input('password: ').strip()
	with open(' ','rt',encoding='utf8') as fr:
		for user_info in fr:
			user_info = user_info.strip('\n')
			user_info_list = user_info.split(':')
            if inp_username==user_info_list[0] and inp_pwd == user_info_list[1]:
                print('login successful')
                break
            else:
                print('false')

定义函数的三种形式

无参函数

在函数阶段括号内没有参数,为无参函数。

注意:定义无参,调用时无需传入参数

有参函数

在定义阶段括号内有参数,成为有参函数。

注意:定义有参,调用必须传入参数。

空函数

def func():
	pass

函数的返回值

什么是返回值

函数内部代码经过一系列逻辑处理获得的结果。

为什么有返回值

  • 需要在程序拿到函数的结果作进一步处理,不需要有返回值
    注意:
  • return是一个函数结束的标志
  • 可以返回任意数据类型
  • 五个数限制,可以用逗号隔开返回多个值
    0个:返回none
    1个:返回值本身
    多个:返回值是元祖
def func():
	name = 'john'
	age = 18
	hobby_list = ['read','run']
	ruturn name,age,hobby_list

函数的调用

调用的三种形式

def max_self(x,y):
    if x>y:
      return x
    else:
        return y
max_self(2,3)
res=max_self(2,3)*10
res1=max_self(max_self(200,300),500)
print(res)
print(res1)

函数参数的应用

形参和实参

实参

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

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

实参

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

func(1,2)

位置参数

位置形参

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

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

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

位置实参

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

func(2,3)

关键字实参

在调用函数时,按照key=value的形式为指定的参数传值,称为关键字实参。

func(z=2,y=3)

特点:可以打破位置的限制,但仍能为指定的形参赋值

注意:

  1. 可以混用位置实参和关键字实参,但是位置实参必须在关键字实参的左边。
  2. 可以混用位置实参和关键字实参,但不能对一个形参重复赋值。
func(x, y=2)
func(y=2, x)  # SyntaxError: positional argument follows keyword argument
func(x, x=1)  # NameError: name 'x' is not defined

可变长参数

可变长参数:指的是在调用函数时,传入的参数个数可以不固定

调用函数时,传值的方式无非两种,一种是位置实参,另一种是关键字实参,因此形参也必须得有两种解决方法,以此来分别接收溢出的位置实参(*)与关键字实参(**)

可变长形参*

形参中的会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给后的参数。需要注意的是:*后的参数名约定俗成为args。

def sum_self(*args):
    res = 0
    for num in args:
        res += num
    return res


res = sum_self(1, 2, 3, 4)
print(res)
10

可变长实参之*

实参中的会将后参数的值循环取出,打散成位置实参。以后但凡碰到实参中带的,它就是位置实参,应该马上打散成位置实参去看。

def func(x, y, z, *args):
    print(x, y, z, args)


func(1, *(1, 2), 3, 4)
1 1 2 (3,4)

可变长形参之**

形参中的** 会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给** 后的参数。需要注意的是:**后的参数名约定俗成为kwargs。

def func(**kwargw):
    print(kwargw)


func(a=5)
('a':5)

可变长实参之**

实参中的会将** 后参数的值循环取出,打散成关键字实参。以后但凡碰到实参中带**的,它就是关键字实参,应该马上打散成关键字实参去看。

def func(x, y, z, **kwargs):
    print(x, y, z, kwargs)


func(1, 3, 4, **{'a': 1, 'b': 2})
1 3 4 {'a': 1, 'b': 2}

可变长参数应用

def index(name, age, sex):
    print(f"name: {name}, age: {age}, sex: {sex}")


def wrapper(*args, **kwargs):
    print(f"args: {args}")
    print(f"kwargs: {kwargs}")
    index(*args, **kwargs)


wrapper(name='nick', sex='male', age=19)
args: ()
kwargs: {'name': 'nick', 'sex': 'male', 'age': 19}
name: nick, age: 19, sex: male

命名关键字形参

命名关键字形参:在函数定义阶段,*后面的参数都是命名关键字参数。

特点:在传值时,必须按照key=value的方式传值,并且key必须命名关键字参数的指定的参数名。

def register(x, y, *, name, gender='male', age):
    print(x)
    print(age)


register(1, 2, name='nick', age=19
1
19

函数对象

函数是第一类对象,即函数可以被当做数据处理。

四大功能
  • 应用
  • .当作参数传给一个函数
  • 可以当作函数的返回值
  • 可以当作容器类型的元素
posted @ 2019-05-29 21:55  1naonao  阅读(204)  评论(0编辑  收藏  举报