4图灵python大海老师函数基础.pdf

函数

使用函数 是为了避免 程序冗长,扩展性差,可读性差等问题
定义函数就相当于制造一个工具一样,以方便用来编写程序。

定义

定义函数def, (函数定义阶段,只检测函数体的语法是否合格,不执行函数体代码)
格式如下
def 函数名():
代码体

调用

python会根据函数名调用代码
通过函数名寻找代码,通过括号来调用代码
调用函数的格式:
函数名()

三大特性:

功能,参数,返回值

功能

函数定义的代码体,都有其目的性,即定义的函数都有其一定的功能要实现。
(当无代码要写时,也需要加个pass,否则会报错)

无代码的情况通常用来进行函数测试项目时会用到

参数

无参、有参

形参、实参、位参、关键字实参、默认参数、不定长参数、实参打散、规范、了解、命名关键字参数、形参与位参的先后关系、拆包

无参函数

应用场景仅仅只是执行一些操作,比如与用户交互,打印

  1. def factory():
  2. print("制造手机")
  3. factory()

有参函数

形参、实参

有需要外部传进来的参数,才能执行相应的逻辑,计算

def fo(x):
    print(x)
fo(5)

形参

位置形参<<默认形参<<不定长形参
指的是在定义函数阶段括号内的变量名(函数完成其工作所需的一项信息)

实参

位置参数 <<<关键字参数<<<打散序列类型<<<*打散散列类型
指的是在函数调用阶断传给参数的值/信息

=============

形参与实参的关系:即在调用函数 时,会将实参(值/信息)传递(赋值)给形参(变量名)

=============

一、位参
位置参数:在被调用时,Python必须将每个实参都关联到函数定义的一个形参中,最简单的方式就是基于实参的顺序。
注意:但凡按照位置定义的形参,都必须按照顺序被实参传值,不能多,也不能少。

二、关键字实参
在调用函数阶段,按照key与value的关系形式,为形参传值。(传递给函数的是键值对。由于在实参中将名称和值关联起来,所以在传入时无需考虑顺序)
注意:
1.可以打乱顺序,但仍然能指名道性地为指定的形参传值。
2.可以混合使用位置实参与关键字实参,但位置实参必须放在关键字实参前,不能对同一个形参重复赋值

默认参数

指的是在定义函数阶段,就已经为某个形参赋值,称其为有默认值 的形参,简称默认形参。
默认参数的值也可以重新赋值来取代默认值。也可用位置参数传入实参。

注意:
1.默认形参在定义阶段已经被赋值,意味着在调用阶段可以不用为其赋值
2.位置形参应该放到默认形参 前边
3.默认形参的默认值在函数定义阶段便已固定


位置形参vs默认形参
对于大多数情况下传的值都不相同,应该定义成位置形参。
对于大多数情况下传的值都是相同的,应该定义成默认形参。


不定长参数

即参数的数量不确定
在形参中带* 会将调用函数时溢出位置实参保存成元组的形式,然后赋值给星号 后的变量名
在形参中带**会将调用函数时溢出关键字实参保存成字典的形式,然后赋值双星后的变量名后的变量名

如下,

def foo(x,y,*z):
    print(x)
    print(y)
    print(z)
    print(*z)  #形参打散
    foo(1,2,3,3,4,5,6)

    结果:
    1
    2
    (3, 3, 4, 5, 6)
3 3 4 5 6

字典本身不能打散,但是在实参传参过程中双星可以打散字典,以关键字参数进行传参。

def fa(x,y,**z):
    print(x,y,z)

fa(1,2,a=3,b=4,c=5)
da={'a': 3, 'b': 4, 'c': 5}
fa(1,2,**da)  #实参传参过程中对字典的拆包传值

结果:
1 2 {'a': 3, 'b': 4, 'c': 5}
1 2 {'a': 3, 'b': 4, 'c': 5}

实参打散

def fa(x,y,z):
    print(x,y,z)
fa(1,*(2,3))  #实参打散

规范

在形参中带与*的,单星后的变量名应该为args,双星后边的变量名应该跟kwargs

了解

命名关键字参数
放在与*之间的参数 应该传入关键字参数。

def fa(x,y,*args,m,n,**z):
    print(x,y,args,m,n,z)
fa(1,2,4,5.6,2,a=3,b=4,c=5,m=3,n=4)

结果:
1 2 (4, 5.6, 2) 3 4 {'a': 3, 'b': 4, 'c': 5}

拆包

字典不能打散,但是实参可以打散字典变成关键字参数进行传参。

元素对应

#一个元素对应一个变量:
a,b,c=[1,2,3]
print(a)
print(b)
print(c)

#多个元素对应一个变量
*a,b,c=(1,2,3,4,5,6,6)
print(a)
print(b)
print(c)
a,*b,c=(1,2,3,4,5,6,6)
print(a)
print(b)
print(c)
d=[1,2,3,4,5]
print(*d)

函数的返回值

返回值 是一个函数处理结束后返回的值,类型不限,数量不限,它表示函数的结束 return

l=[1,2,3,6,654,4]
l.append(5)
print(l)
a=l
print(a)
n=l.append(6)
print(n,l)
b=l.pop(1)
print(b)

结果:
[1, 2, 3, 6, 654, 4, 5]
[1, 2, 3, 6, 654, 4, 5]
None [1, 2, 3, 6, 654, 4, 5, 6]
2

1.return是一个函数结束的标志,函数内可以有多个return,

但是只要执行一次,整个函数就会结束运行,这一点可以用来结束循环。

默认return,None

2.return的返回值无类型限制,即可以是任意数据类型

3.其返回值无数量限制,即可以用逗号隔开任意多个任意类型的值
0个,返回None,(不写return默认会在函数 的最后一行添加return None
1个的话,返回的值就是该值本身
多个的话返回的值会是元组

函数的调用的三种方式

语句形式

def factory():
    print("制造手机")
factory()

表达式形式

def factory(x,y):
    res=x+y
    return res
res=factory(2,3)
print(res)
res1=factory(2,3)*100
print(res1)

参数形式

可以当作是参数传给另一个参数

def max2(x,y):
    if x>y:
        return x
    else:
        return y
print(max2(max2(3,45),max2(12,25)))

函数局部变量和全局变量的关系

局外变量不能访问局内变量
局内变量可以访问局外变量
局内变量不能修改局外变量

函数全局变量
新的定义函数内部,
对于出现了局内变量和函数外的全局变量相同时,如果没有加global函数,则只是在定义函数内部引用,读取该函数,函数内部的重新赋值不修改函数外的赋值,

global

而如果加了global,则相当于对于全局变量进行了重新赋值

可以借助global在函数内修改全局变量的值

x=345
def fun3():
    #局部变量在赋值前被引用
    global x
    x=x+1
    print(x)
fun3()

nonlocal

nonlocal可以让嵌套函数修改嵌套函数之外的值

def fu2():
    b=543
    def fu3():
        nonlocal b
        b +=1
        print(b)
    fu3()
fu2()

常用的内置函数

abs

绝对值:abs

min

最小值 min

max

最大值max

sum

求和sum

all

全为真才为真(空也为真),其余均为假:all(可迭代对象),返回的是布尔值

any

全为假才是假(空也为假),其余均为真:any 同样返回的也是布尔值

ascii

英文字符编码表:ascii (可百度搜索)

day4  函数基础 - 图1

ord()

可以把字符转换成编码

print(ord("d"))

结果: 100

chr()

可以把编码转换成字符

print(chr(98))

结果:b

zip

拉链函数:zip

t1=['a','b','c','d']
t2=[1,2,3,4,5,6]
print(list(zip(t1,t2)))

结果:
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

exec

执行字符串中的代码,支持python语法

print(1+5)
exec("print(1+5)")

结果:
6
6