python的函数

69 阅读9分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

大家好,我是木大木大,因为疫情和环境原因啊,在家开始了自学python的路子,从此深坑加一人。后面我会每天持续更新一些学习python的过程,当然一开始就是一些基础啦,希望大家多多支持,莫嫌弃啦~

函数

1.1 函数简介 function

函数:可以用来保存代码,在需要的时候,对这些语句进行重复调用

优点:

1.遇到重复功能的时候,直接调用即可,减少代码量

2.提升代码,项目的结构性,分工明确,提高代码可读性

3.遇到扩展功能的时候,修改比较方便

将一段有规律的、可重复使用的代码定义成函数,从而达到一次编写,多次调用的目的

len() 字符串的长度

def my_len(s):
    leng = 0
    for c in s:
        leng+=1
    return leng
leng = my_len("https://www.baidu.com/")
print(leng)
leng = my_len("my name is xiaochuan")
print(leng)

1.2 函数的定义

def 函数名(形参1,形参2...形参n):
    代码块(函数体)
函数名的命名规则:
1.可以由数字、字母、下划线组成
2.首字母不能是数字
3.不能用关键字
规范:
1.见名知意
2.下划线命名法
3.驼峰命名法

1.3 函数的调用

def fn():
    print("这是我的第一个函数")
print(fn)  # <function fn at 0x000001CA2AA173A0>
print(type(fn))  #<class 'function'>
调用函数语法:
函数对象()
先定义再调用
def fn():
    print("hello")
    print("我叫木大")
    print("吃了吗")
    print("再见")


fn()
注意:
fn       是什么   函数对象
fn()     是什么   调用函数
print    是什么   函数对象
print()  是什么   调用函数
定义一个login函数,功能是 输入用户名和密码,验证登录是否正确,用户名是root   密码是123456
def login():
    username = input("请输入用户名:")
    password = input("请输入密码:")
    if username=='root' and password=='123456':
        print("登录成功")
    else:
        print("登录失败")

login()

1.4 函数的参数

1.4.1 形参和实参

函数的参数:在定义函数时,可以在函数名后()中定义数量不等的形参,注意可以有也可以没有,可以有一个也可以有多个,多个形参之间使用逗号隔开,逗号是英文的

什么叫形参?

形参(形式参数):定义形参就相当于在函数内部声明了变量,但是并不赋值,这个变量只是先形式的在函数里面使用,但是它并没有值
实参(实际参数):在函数定义时指定了形参,在调用的时候也必须传递实参,我们的实参会赋值给对应的形参
有几个形参就得传几个实参
def fn(a,b):
    print("a=",a)
    print("b=",b)
fn(10,20)
fn(66,33)
定义一个函数,功能是计算2个数的和
def sum1(a,b):
    # print(a+b)
    print(a,'+',b,'=',a+b)
sum1(111,222)
总结:我们在定义函数的时候那个叫做形参,为什么叫做形参,是因为那个参数是形式的,并没有值,需要在调用的时候才确定
调用的时候叫实参
定义多少个形参就必须得传递多少个实参

1.4.2 参数的传递方式

1.4.2.1 默认值参数

def fn(a,b,c=10):
    print("a=",a)
    print("b=",b)
    print("c=",c)
fn(1,2)

如果传递了第三个参数,那么就是传递的值,如果没有传递就是默认值

1.4.2.2 位置参数和关键字参数

1.位置参数,就是将对应位置的实参赋值给对应位置的形参
def ms(年龄,姓名,手机号,qq号,微信号,国家,父亲名字,母亲名字,性别....)
ms()
这样按照位置参数传递就很容易出错

2.关键字参数
可以不按照形参定义的顺序来传递,而是直接根据参数名来传递参数
def fn(a,b,c):
    print("a=",a)
    print("b=",b)
    print("c=",c)
fn(b=1,c=2,a=3)


def fn(a,b,c):
    print("a=",a)
    print("b=",b)
    print("c=",c)
fn(1,2,c=20)  # 混合使用关键字参数和位置参数的时候,位置参数必须写在关键字参数的前面
fn(c=20,1,2)  # 报错

1.4.3 实参的类型

实参可以传递任意类型

def fn2(a):
    print('a=',a)
a = 123
fn2(a)
b = True
fn2(b)
c = 'hello'
fn2(c)
d = [1,2,3]
fn2(d)


def fn(a,b,c):
    print("a=",a)
    print("b=",b)
    print("c=",c)
fn(1,2,c=20)  # 混合使用关键字参数和位置参数的时候,位置参数必须写在关键字参数的前面

def fn2(a):
    print('a=',a)

b = fn  # fn
fn2(b)

# 将上面的函数对象fn赋值给变量b,在调用fn2的时候,b作为fn2的实参传递给fn2的形参a,此时a的值就是b,b的值就是fn
# b——》fn
# a——》b

2.1 函数的参数

2.1.1 可变参数

2.1.1.1 *args

可变参数也叫作不定长参数

def fn(*a):
    print(a)
    print(type(a))
fn(1,2,3,4,5)
*a能接收所有的实参,并且将实参保存到一个元组中(装包:把这些散开的数据,装到一个元组里面,这就可以叫做装包)

定义一个函数,可以求任意个数的和
def sum1(*b):
    result = 0
    for i in b:
        result+=i
    print(result)
sum1(1)
sum1(1,2)
sum1(1,2,3)

注意:
1.带 * 号的形参只能有一个
2.带 * 号的参数可以和其他参数配合使用,但是得写在最后面
def fn(a,b,*c):
    print("a=",a)
    print("b=",b)
    print("c=",c)
fn(1,2,3,4,5,6)

a= 1
b= 2
c= (3, 4, 5, 6)

def fn(*a,b,c):
    print("a=",a)
    print("b=",b)
    print("c=",c)
fn(1,2,3,4,5,6,b=4,c=8)  # 使用关键字参数传递就可以解决可变参数写在最前面的情况
a= (1, 2, 3, 4, 5, 6)
b= 4
c= 8

取带*号参数的名字的时候一般取*args

2.1.1.2 **kwargs

def fn(**args):
    print("args=",args)
    print(type(args))
fn(a=1,b=2,c=3)
总结:
**形参可以接收任意的关键字参数,会将这些参数统一保存到字典里面,字典的键就是参数的名字,字典的值参数的值,所以现在这个键就是a,值就是1,键是b,值是2,键是c,值是3

注意:
**形参也是只能有一个,并且必须写在所有参数最后,他必须得是最后一个,命名潜规则是**kwargs
*args 和 **kwargs同时使用:
同时使用*args和**kwargs时,*args必须写在**kwargs之前,这是规定
def fn(a,b,*args,**kwargs):
    print(a)
    print(b)
    print(args)
    print(kwargs)
fn(1,2,34,5,5,3,4,1,1,5,6,1,k=1,q=3,ww=5,rr=8)

1
2
(34, 5, 5, 3, 4, 1, 1, 5, 6, 1)
{'k': 1, 'q': 3, 'ww': 5, 'rr': 8}

2.1.2 参数解包

传递实参时,也可以在序列类型的参数前添加星号,这样他会自动的将序列中的元素依次作为参数传递
但是注意,序列中元素的个数必须和函数形参的个数一致
def fn(a,b,c):
    print("a=",a)
    print("b=",b)
    print("c=",c)
t = (1,2,3)
# fn(t[0],t[1],t[2])
fn(*t)  # 解包
fn(*[3,4,5])
# fn(*[3,4,5,6])  # 报错

# 需要注意的是,字典要满足一个点就是key的名字要和参数对得上
def fn(a,b,c):
    print("a=",a)
    print("b=",b)
    print("c=",c)
d = {"a":10,'b':20,'c':30}
fn(**d)
总结:
1.*args适用于接收多余的未命名的位置参数
**kwargs适用于接收关键字参数,其中args是一个元组类型,而kwargs是一个字典类型的数据
2.*args是把元组中的数据进行拆包,也就是把元组中的数据拆成单个的数据
**kwargs是把字典中的数据进行拆包,也就是把字典中的数据拆成单个的键值对

2.2 函数返回值

返回值:函数执行以后返回的结果

f(x) = 2x+1

x = 1 得到 3 f(1) = 3

x = 2 得到 5 f(2) = 5

x = 3 得到 7 f(3) = 7

def fn():
    return 1
x = fn()
print(x)
print(fn())

# return后面是什么 函数的返回值就是什么
return后面可以是任意的值
def fn():
    return 1,3,5  # 看似返回很多个值,隐式的会被python分装成一个元组返回
x = fn()
print(x)
print(fn())
# 返回一个函数
def fn():
    def fn2():
        print("hello")
    return fn2
r=fn()  # fn()——》fn2
# r——》fn()   r——》fn2   函数对象  地址
# print(r)  #<function fn.<locals>.fn2 at 0x00000224EC4A65E0>
r()  # fn2()
如果不给一个函数return的话那么这个函数的返回值就是空(None)
def fn2():
    pass
print(fn2())  # None 代表空值
print(type(None))  # <class 'NoneType'>
对于没有定义return语句的函数,python都会在末尾默认加上return None,表示这个函数默认返回空值
也就是说只要你的函数不带return就是返回None
def fn():
    return
print(fn())  # None

总结:如果仅仅写一个return 或者不写return,则就等价于 return None
在函数中return代表函数执行结束,后面的代码不会再执行

def sum1(*args):
    result = 0
    for i in args:
        result+=i
    return result
r = sum1(1,2,3,4)
print(r+10)

print(len("hello"))
fn 和fn()的区别
print(fn)  # fn是函数对象,打印fn其实就是在打印函数对象,地址
print(fn())  # fn()是在调用函数,打印fn()其实就是在打印fn()的返回值
总结:
return 语句的作用:
结束函数调用、返回值
函数体中 return语句有指定返回值时 返回的就是其值
函数体中没有return语句时,函数运行结束会隐含返回一个None作为返回值,类型时NoneType,与returnreturn None等效 都是返回 None
需要注意的是,return语句在同一函数中可以出现多次,但是只要有一个得到执行,就会直接结束函数的执行

print与return的区别:
print仅仅是打印在控制台,而return则是将return后面的部分作为返回值:作为函数的输出,可以用变量接收,继续使用该返回值做其他的事情

None(空值)
和False不同,它不表示 0 ,也不表示空字符串,而表示的是没有值,也就是空值
None有自己的数据类型,NoneType 类型
None是NoneType数据类型的唯一值

今天的内容就到这里啦,感谢阅读喔~