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这个引用能不能作为一个形式参数去使用。

函数不加括号是地址引用,加括号是返回值

 

posted @ 2023-05-14 21:37  Snom  阅读(47)  评论(0)    收藏  举报