函数初始

一、什么是函数:

函数英文名function,直译的话就是功能,所以顾名思义,python中的函数是为了实现功能而生的,有的同学要问了,之前用面向过程不是也可以实现功能吗,这么说也没错,不过,我们先来看一下下面的情况:

比如我们要是得到一个可迭代对象的长度,如果我们用面向过程来实现就会出现下面的情况

s = "alexdsb"
n = 0
for i in s:
    n += 1
print(n)
s = "alexdsb"
n = 0
for i in s:
    n += 1
print(n)

上面只是求一个字符串的情况,如果我还有一个列表,一个字典,一个元祖...,该怎么办,是不是需要把这些代码复制很多很多次,这样会产生大量的重复代码,非常不方便,如果我们用函数的话,就可以像下面这样:

s = "alexdsb"
def my_len(s):
        n = 0
    for i in s:
        n += 1
    print(n)
my_len(s)

s = "alexdsb"
def my_len(s):
        n = 0
    for i in s:
        n += 1
    print(n)
my_len(s)

只要这个对象可迭代,我们把这个对象传到函数的参数里就可以了,然后放心的让函数自己工作就可以了,等等,参数是什么,又是怎么传到函数里的,这个什么def,是什么,我只知道DNF,变量名加括号又是什么,下面我们一一来解答。

首先我们来看一下函数的基本结构:

二、函数的基本结构

def func(): #这是定义函数
    pass #这是函数体
func()#这是函数的调用
def func(): #这是定义函数
    pass #这是函数体
func()#这是函数的调用
  • 上面代码块里第一行的def,再说一遍不是DNF,是python中的关键字,就是告诉python我们要定义函数了
  • func()是函数名,不是变量名,就是说明这个函数叫什么,起个名字,规则和变量名是一致的,
  • pass老哥待得地方叫函数体,这里只是麻烦他占个位置,实际上我们需要把我们要实现的功能写进去,
  • func()是调用这个函数,就像你请了一个人来干活,需要他的时候你得叫他一声吧,告诉人家该干活了,要不函数是不会自己动的

好了,函数长什么样子我们基本上认识了,可能有的同学要问了,为什么这个基本结构里的括号中没有参数,这是我们下面要说的。

三、函数的参数

1、什么是参数

首先我们说一下什么是参数,参数就像一个聪明的工人,你可以给他不同的材料让他去加工,可以调到别的地方去干活,没有参数的函数就有点呆,只会加工你一开始交给他的材料,而且自己干自己的,不和别人协作 ,你想让他干别的,就得重新培训,就像这样:

app1 = '微信'
def yue(): 
    print("打开手机")
    print(f"打开{app1}")
    print("聊一聊")
    print("见一见")
    print("......")
yue()
app1 = '微信'
def yue(): 
    print("打开手机")
    print(f"打开{app1}")
    print("聊一聊")
    print("见一见")
    print("......")
yue()

我们如果想把第二个print的结果更改就需要把变量app1换掉,这样才能修改,可是如果我们通过参数传递呢?就是这样:

def yue(app1,app2,app3,app4):  # 形参
    # 函数帮咱们做了一个赋值 app = "陌陌"
    print("打开手机")
    print(f"打开{app1} {app2}")
    print("聊一聊")
    print("见一见")
    print("......")
yue("微信","探探","陌陌","soul")   
def yue(app1,app2,app3,app4):  # 形参
    # 函数帮咱们做了一个赋值 app = "陌陌"
    print("打开手机")
    print(f"打开{app1} {app2}")
    print("聊一聊")
    print("见一见")
    print("......")
yue("微信","探探","陌陌","soul")

这样我们可以随便给函数这个工人递材料,你问怎么递?

  • 函数调用位置的参数叫实参就是我们实际要传给函数的材料
  • 函数名位置的参数,是形参,就是函数名的挂件,可以随意更换,所以他是变量名的形式

但是参数的传递也不是随意的,他有他的规则,这就是参数的类型:

2、参数的类型

函数的参数总共有三种,分别是,位置参数,默认参数,关键字参数

1、位置参数:

位置参数顾名思义是按位置来的,就是实参上参数的排列,要和形参上的位置保持一致,就是我们要把对应的东西放到对应的盒子里,虽然不会报错,但是会出问题比如

def func(name,sex)
    print(f'姓名{name},性别{sex})
  
func('男','小明')
          
def func(name,sex)
    print(f'姓名{name},性别{sex})
  
func('男','小明')

输出的结果就会变为,姓名男,性别小明会闹笑话

所以我们要保证实参和形参==一!一!对!应!==

2、默认参数

默认参数顾名思义,就是默认就是这个参数,形式是这样的

def func(name,sex='男')
    print(f'姓名{name},性别{sex})
  
func('小明')
def func(name,sex='男')
    print(f'姓名{name},性别{sex})
  
func('小明')

就是函数会自己默认某个参数就是形参中的内容,所以不用我们再去告诉他需要加工什么了,但是注意,如果你写了默认参数千万不要再在形参中以默认参数的形式添加此类参数,要不然默认参数的内容会被覆盖掉,你问为什么?

这是因为位置参数的优先级会高于默认参数,就是新交代的任务会优先去执行,同样在形参位置排列的时候,也是要把位置参数排在前面,先把新交代的任务全都接受完,再处理默认的工作

3、关键字参数

关键字参数的形式是这样的

def func(a,b)
    print(f'姓名{a},性别{b})
  
func(a = '小明',b = '男')
def func(a,b)
    print(f'姓名{a},性别{b})
  
func(a = '小明',b = '男')

很明显关键字参数就是提前贴好标签,谁去哪安排好,但是要注意,他的优先级也没有位置参数高

说完了参数我们再来看一个函数的隐藏功能,之前我们在学字典的时候字典有一个方法,叫dic.get(),通过字典的键来获取字典的值,这个值一返回值的形式出现,这个get()就是函数,我们自己写的函数也是有返回值的,

lst = [1,2,3,4,5,6,7]
def my_len(a):
    lt = []
    if type(a) == tuple or type(a) == list:
        for i in range(len(a)):
            if i%2 == 1:
                lt.append(a[i])
        return lt
    else:
        print('输入参数有误')
print(my_len(lst))
lst = [1,2,3,4,5,6,7]
def my_len(a):
    lt = []
    if type(a) == tuple or type(a) == list:
        for i in range(len(a)):
            if i%2 == 1:
                lt.append(a[i])
        return lt
    else:
        print('输入参数有误')
print(my_len(lst))

这个return就是返回的意思,并且可以返回一切,但是切记,如果你在while或for循环中发现了return注意,它停止的不是循环是这个函数,如果我们不写,或return后面没有跟东西,函数就会告诉我们他什么都没拿到,就是None

还有一般情况下,你写什么数据类型,就返回什么,但是·如果你在return后面发现了这么个东西

return 1,2,3,4
return 1,2,3,4

注意,它返回的是个元组

最后说一点题外话,我们在用if else做判断的时候,通常这样写

if a > b:
    print(a)
else:
    print(b)
if a > b:
    print(a)
else:
    print(b)

要写好几行,但是我们来看一种写法

print(a) if a>b else print(b)
print(a) if a>b else print(b)

这种写法叫做三元运算符,基本结构是:

条件成立的结果 条件 条件不成立的结果