一、函数的初识

1、如何定义函数:
def 函数名():
  代码...

例如:
def my_len():
    l = [1, 2, 3, 4]
    count = 0
    for i in l:
        count += 1
    print(count)

2、函数的优点:
1,减少代码的重复率。
2,增强代码的阅读性。

3、函数到底是什么?
函数最主要的目的:封装一个功能。

4、函数如何调用:函数名 ()
my_len()

5、总结
定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。
   def 是固定的,不能变,他就是定义函数的关键字。
   空格 为了将def关键字和函数名分开,必须空,当然你可以空2格、3格或者你想空多少都行,但正常人还是空1格。
   函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能。
   括号:是必须加的!

注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。

调用:就是 函数名() 要记得加上括号。

 

二、函数的返回值:return

1、函数中如果遇到retrun, 则直接结束函数。

2、给函数的执行者返回值。
1,不写return和只写return: 返回None
2,return 单个值: 原封不动的返回(返回的数据类型也一致)
3,return 多个值: 返回一个元组,所有的返回值作为元组的每一个元素

(1)不写return
def func1():
    print(111)
    print(222)
res = func1()  # 111 222
print(res)  # None

(1 - 2)只写return
def func1():
    print(111)
    print(222)
    return
res = func1()  # 111 222
print(res)  # None

(2)return 单个值
def fun1():
    a = 1
    b = 'hello'
    c = [1, 2, 3]
    return a
res = fun1()
print(res)  # 1

(3)return 多个值
def fun1():
    a = 1
    b = 'hello'
    c = [1, 2, 3]
    return a, b, c
res = fun1()
print(res)  # (1, 'hello', [1, 2, 3])

注意:工作中,函数中尽量不要出现print,这里只是为了展示函数的用法才使用的

 

三、函数的参数

1、简单介绍

# 函数定义
def mylen(s):
    """计算s的长度"""
    length = 0
    for i in s:
        length += 1
    return length


# 函数调用
str_len = mylen("hello world")
print('str_len : %s' % (str_len))  # str_len : 11

这里我们要告诉mylen函数要计算的字符串是谁,这个过程就叫做传递参数,
简称传参,我们调用函数时传递的这个“hello world”和定义函数时的s就是参数。

这个“hello world”被称为实际参数,因为这个是实际的要交给函数的内容,简称实参。

定义函数时的s,只是一个变量的名字,被称为形式参数,因为在定义函数的时候它只是一个形式并不是真正的数据,
表示这里有一个参数,简称形参。

 

2、实参

1,位置参数:按照顺序,一一对应
def func1(x, y):
    print(x, y)


func1(1, 2)  # 位置参数,1对应传给x,2对应传给y


2,关键字传参:可以不按照顺序,但是必须一一对应
def func1(x, y):
    return x + y


print(func1(y=100, x=99))  # 关键字参数,我们写实参的时候直接声明了形参y对应100,x对应99


3,混合传参:关键字参数一定要在位置参数后面
def func1(a, b, x, y):
    return b + y

print(func1(100, 200, y=100, x=99))  # 300

 

3、形参

1,位置参数 按照顺序,一一对应
def func(x, y, z):
    print(x, y, z)


func(1, 2, 3)


2,默认参数:给其传值,将原默认参数覆盖掉,不传值,不报错,使用默认值。
应用场景:不经常改变的参数,但是一直在用。
def func1(x, y, a=666):
    print(x, y, a)


func1(1, 2)  # 1 2 666
func1(1, 2, 333)  # 1 2 333

注意:
默认参数一般设置为不可变的数据类型(str,int,tuple等),
若默认参数设置为可变的数据类型(list,dict等),那么执行一次后,这个可变的数据类型它始终用的是同一个。
def fun1(x, l1=[]):
    l1.append(x)
    return l1


res = fun1(20)
print(res, id(res))  # [20] 2192007779592

res1 = fun1(100)
print(res1, id(res1))  # [20, 100] 2192007779592

 

4、参数总结

实参:
位置参数:按照顺序,一一对应
关键字参数:可以不按照顺序,但是必须一一对应
混合参数:关键字参数一定要在位置参数后面

形参
位置参数:按照顺序,一一对应
默认参数:给其传值,将原默认参数覆盖掉,不传值,不报错,使用默认值


小知识点:只针对于简单的if else 这样的结构,才可以使用。
def fun(x, y):
    if x > y:
        return x
    else:
        return y


print(fun(1, 2))

上面代码可以下成下面的代码:
def fun(x, y):
    return x if x > y else y


print(fun(1, 2))