Python基础笔记4(函数)
1.函数
函数根据是否自己编写可以分为两类。
别人已经写好拿来直接用的函数,称为包括Python内置函数或者第三方包中的函数,更省事。
开发者自己编写的函数(通常称为自定义函数);根据需要自己编写,更灵活。
自定义函数
定义函数
def 函数名(形参)
“”“
函数说明文档
”“”
函数体
函数名:一定有,按照命名规则起个名字,Python中建议使用“小写加下划线”的方式,一般以动词开头,例如print_info而不用PrintInfo
函数体:一定有,就是整个函数真正要执行的代码,注意函数体前面缩进4个空格
形参:可有可无,专门用过来存储调用时传递给函数的数据用的。
注意:定义了函数,这个函数不会被执行。就好比你发明了一个功能,这个功能不能自己用自己,必须等待别人使用才行,如果想让函数执行,就需要调用函数。
def test():
pass
如果一个函数中的执行代码在没有想好的情况下,我们可以使用pass关键字进行代码占位
保证第一的函数不会报错,如果想好了功能,则可以将pass删除,写入自己的功能逻辑即可
pass没有任何意义,但是占用解释器解释的时间,所以一定要删
函数说明文档,用来查看这个函数的功能以及用法
函数名.__doc__ ,用于查看函数的说明文档
调用函数
通俗的讲:定义函数相当于打造了一个工具,调用函数相当于使用这个工具完成想要做的事情。
调用函数的格式如下:
函数名(实参)
函数名:一定有,想要调用的函数名字
实参:可有可无,调用函数时给它传递的数据
注意:调用函数的名字必须是先定义好的才能够调用,否则会失败
内置函数
id() # 用来查询一个对象在内存中的地址
print()
input()
len()
del() 或 del
time
random 生成一个随机数
import time
内置模块
import random
import os
import sys
import json
函数说明文档
如:request.get?可以直接打印函数的定义说明
使用流程
# 两数相加的函数
def add_num(a, b)
print(a + b)
如果函数声明是()中存在变量名,name我们在函数调用的时候,需要根据变量个数传递值
定义函数时,()中定义变量,变量的个数根据需要的个数来确定,这些变量的目的是用来存储传递过来的数据。我们把这些变量称之为形参。
调用函数时,()中写入要传递的数据,可以是常量、表达式、变量等,这些就是要真实传递的数据。我们把这些数据称之为实参
def test(num1, num2): # 形参:调用函数时用来存储数据的变量
print("传递过来的第一个数是:%d" % num1)
print("传递过来的第二个数是:%d" % num2)
print("他们俩的和是:%d" % (num1 + num2))
test(100, 200) # 实参:在抵用函数时传入的具体的值
函数返回值
所谓的返回值,就是函数完成一件事后,最后给调用者的结果
使用流程
想要用函数的返回结果,我们需要注意两点
定义函数时,需要使用return将结果返回
调用函数时,需要存储这个返回值(当然语法上来讲可以不存,但一般情况下都会存储,否则还要返回值干什么)
return除了可以返回一个结果之外
还可以终止一个函数的运行
return后面的代码不会被执行,解释器一旦遇到了return会做两件事:1.返回结果 2.结束运行函数
如果一个函数中没有return关键字,则解释器会默认提供一个return None
如果一个函数中的结果不止一个,则需要将返回结果写到同一行同一个return中,默认打包成一个元组,可以通过返回列表的方式返回。
def my_function():
return 1, 2, 3 # 返回结果为:(1, 2, 3),默认为元组
return [1, 2, 3] # 可以自定义列表的方式返回
print(my_function())
函数与函数之间互相隔离
我们知道函数是一个具有独立功能的代码块,在前面的学习中,知道一般情况下把一个个功能都单独做成一个个函数。
在开发代码时,把独立功能做成一个个函数其实就是封装的思想,通过这种方式能够让代码更加整洁。
Python中,根据封装级别的不同,我们会陆续接触到函数、类、对象、模块、包等
封装最大的特点就是:高内聚低耦合,大白话讲:相关的功能全部封装到函数中(这是高内聚),尽量减少函数与函数之间的依赖(低耦合),
也就是说一个函数的改动对其他函数来说没有影响。
因此我们在编写代码时,要谨记“高内聚低耦合”,尽量做到函数与函数之间没有关系。
另外要注意是“低耦合”,而非“零耦合”,也就是函数之间多多少少还是有千丝万缕的关系,大白话讲就是函数之间还是有关系的
函数与函数之间的关系
根据代码的不同,存在3种关系
可能公用同一个变量,会导致一个函数添加了数据,另外一个函数删除了数据
可能一个函数的返回值,被当做另外一个函数的参数
可能一个函数体重调用了另外一个函数
变量与函数关系
全局变量
num = 10
def test_1():
global num
num += 1
当前num是一个全局变量,如果要在一个函数内部使用,必须在函数内部声明这是一个全局变量,否则会报错
函数再次调用全局变量,后面函数的调用是全局变量修改后的值。
如果一个变量不在任何一个代码块之中,则这个变量就是一个全局变量
可以被当前文件中任意代码块访问
整型的全局变量不可以被修改,需要加global才可以被修改
如果当前全局变量的类型是一个可以被修改的对象的话,不需要加global,比如list类型
函数嵌套调用
一种函数中又嗲用了另外一个函数的方式
能够让函数之间互相使用,增加代码复用性
局部变量
函数类型
形参
缺省参数
不定长参数
当需要使用不定长参数时,建议顺序,形参->缺省参数->*args->**arges

可以显式的写入参数的类型,但是调用时并不会进行类型的检查
可以定义返回值类型,但是没什么用
def test_5(a: int, b: int) -> int: # 定义返回值类型,但是没什么用
return a + b
res = test_5(2, '6') # 不报错,因不会进行类型检查
print(res) # 报错
如果为了防止类型报错,可以增加isinstance()增加类型判断

拆包
拆包时要注意,需要拆包的个数与返回值的个数,顺序一样
*号拆包,需要注意参数个数以及传递的参数位置
支持列表,元组,集合都可以用*
拆字典要用**
*args
**kwargs
他们两个没有任何关系,一个是接收元组的,一个是接收字典的
用在定义函数时,供其他人使用的时候
如果没有不定长参数的情况,在调用函数时参数的个数超出了函数参数个数时会报错

函数名也是引用
引用:就是地址,可以理解为存放数据的空间在内存中的地址
python解释器在内部开辟一个小整数对象池[-5,257),在这数字范围内,他们的id才会相等,超出了这个范围就是不行了。
同样的道理,字符串对象也有一个类似的缓冲池,超过区间范围内,自然也不会相等
闭包

匿名函数
其实就是一个没有名字的函数
是一种具有函数行为的表达式
一般是配合变量去使用
# 没有参数的情况
obj = lambda: '这是一个匿名函数'
print(obj())

既然lamdba函数是一种表达式,使用赋值运算符可以将当前lambda表达式的引用传递给变量,name这个引用能不能作为一个形式参数去使用。
函数不加括号是地址引用,加括号是返回值


浙公网安备 33010602011771号