Python 学习笔记 day06--函数-模块与包

Python函数、模块与包学习笔记

1. 函数

函数是一段实现某个功能的完整代码,仅在调用时运行,达到一次编写,多次调用
也可以将数据(称为参数)传递到函数中,函数可以把数据作为结果返回。
python中函数分为两大类:内置函数、自定义函数

1.1 内置函数

len() :计算长度或元素个数

copy() :拷贝

sorted() :排序,返回新列表,原序列不变

1.2 自定义函数

在 Python 中,使用 def 关键字定义一个想实现功能的函数:

def  函数名(形式参数1, 形参2\参数列表):
    实现某个功能的完整代码

def 关键字: 全称define 
函数名:遵循标识符命名规则
形参:要求调用者提供的数据

#没有参数,也没有返回值
def xz():
    print("主角出世")
    print("主角修炼")
    print("主角成神")


# 空两行
print("xz")  
xz()  # 调用函数
print("123")

#----xz
#----主角出世
#----主角修炼
#----主角成神
#----123
#有参数,有返回值
def q1(n1, n2):
    """
    求和
    :param n1: 加数1
    :param n2: 加数2
    :return: 求和的结果
    """#函数特有的注释
    q2 = n1 + n2
    print(q2)


q1(2, 3)
q1(2.2, 1)

#----5
#----3.2

在函数外面短暂调用

def q1(n1, n2):
    q2 = n1 + n2  # 计算两数之和
    print(q2)  # 打印计算结果
    return q2  # 返回计算结果
# return:将数据返回给调用者(不直接显示)


# 第一次调用
q1(3, 5)  # 输出:8

# 第二次调用
print("q2:", q1(3, 5))  # 输出:8 和 q2: 8
# 直接作为print参数

# 第三次调用
q3 = q1(3, 5)  # 输出:8  
print("q3:", q3)  # 输出:q3: 8
# 先存储到变量,再使用变量

#----8        ← 来自 q1(3, 5)
#----8        ← 来自 print("q2:", q1(3, 5)) 中的函数调用
#----q2: 8    ← 来自 print("q2:", ...)
#----8        ← 来自 q3 = q1(3, 5)
#----q3: 8    ← 来自 print("q3:", q3)

#q3 = q1(3, 5)
#将函数返回值存储在变量中
#后续可通过变量名复用结果
#避免重复计算(对比嵌套调用时的多次执行

 支持返回多个元素,用一个变量名接收时,以元组的形式;
# 也可以定义多个变量依次接收

def q1(n1, n2):
    q2 = n1 + n2  # 计算两数之和
    print(q2)  # 打印计算结果
    return q2, n1, n2  # 返回计算结果


# 第一次调用
q1(3, 5)  # 输出:8

# 支持返回多个元素,用一个变量名接收时,以元组的形式;
# 也可以定义多个变量依次接收
# q3 = q1(3, 5)  # 输出:8
q3, q4, q5 = q1(3, 5)
print("q3:", q3)  # 输出:q3: 8
# 先存储到变量,再使用变量

1.3 可变/不可变类型传参区别

不可变类型:数字、字符串、元组
可变类型:列表、集合、字典

def w(n1, n2):
    n1 = "PS"
    n2["name"] = "ll"


a = "CAD"
b = {"name": "xy"}
w(a, b)
print(a)
print(b)

#----CAD
#----{'name': 'll'}

# 不可变类型传参时,函数内部修改不影响原数据的值
# 可变类型传参时,函数内部修改会改变原数据的值

1.4 函数传参

1.4.1 位置传参

调用时候,参数的个数和顺序必须和定义的参数个数和顺序相同
def w(n1, n2):
    n1 = "PS"
    n2["name"] = "ll"


a = "CAD"
b = {"name": "xy"}
w(a, b)
print(a)
print(b)

#----CAD
#----{'name': 'll'}
#----定义的位置与传参位置一致

1.4.2 关键字传参

调用函数 形参名字 = 方式进行传参传递参数顺序可以定义参数顺序不同

def w(n1, n2,n3):
    n1 = "PS"
    n2["name"] = "ll"


a = "CAD"
b = {"name": "xy"}
c="ss"
w(n2=b, n1=a,n3=c)
print(a)
print(b)
print(c)

#----CAD
#----{'name': 'll'}
#----ss
#定义几个要传几个,两者要一致,否则报错

如果同时使用 位置传参关键字传参传参顺序必须先写位置传参

def w(a1, a2, n1, n2):
    n1 = "PS"
    n2["name"] = "ll"


a = "CAD"
b = {"name": "xy"}
w(123, 456, n2=b, n1=a)
print(a)
print(b)

1.4.3 默认参数

定义函数直接形参赋值如果参数不传参使用默认值如果参数传参使用传递

def r1(name, age, sex='n'):
    print(name, age, sex)


r1("xy", 23)

#----xy 23 n

1.4.4 不定长参数

定义函数形参*args表示数据类型元组。每次调函数参数个数不同

def r1(*args):
    print(args)


r1("xy", 15, "we", [5, 3], {22, 55, "fg"})

#----('xy', 15, 'we', [5, 3], {'fg', 22, 55})

1.4.5 关键字不定长参数

**kwargs

输入关键字参数中的关键字当做键值对实参当做键值对

def r1(**kwargs):
    print(kwargs)
    print(type(kwargs))


r1(name="xy", age=15, sex="boy")
r1(name="th", age=18, se="girl")
# r1(sex="girl", name="th", age=18) 也可以,但打印是按照输入顺序打印

#----{'name': 'xy', 'age': 15, 'sex': 'boy'}
#----<class 'dict'>
#----{'name': 'th', 'age': 18, 'se': 'girl'}
#----<class 'dict'>

*args **kwargs同时出现一个函数

def r1(*args, **kwargs):
    print(args)
    print(kwargs)


r1(11, 25, name="xy", age=15, sex="boy")
r1(23, 25, name="th", age=18, sex="girl", hobby="ping pong")

#----(11, 25)
#----{'name': 'xy', 'age': 15, 'sex': 'boy'}
#----(23, 25)
#----{'name': 'th', 'age': 18, 'sex': 'girl', 'hobby': 'ping pong'}

1.5 函数返回值

如果函数的运行结果需要在当前函数体外使用,可以将其定义成带有返回值的函数
返回值用return关键字定义

return可以出现在函数的任意位置用于结束函数,返回值可以是一个值,或多个值,当返回多个值,默认是元组类型。函数没有返回值,结果为none

def t1(n1, n2):
    t2 = n1 + n2
    return t2
    print(t2)


t1(3, 6)
print("t2:", t1(3, 6))

#----t2: 9

#多值
def t1(n1, n2):
    t2 = n1 + n2
    return t2, n1, n2
    print(t2)


t1(3, 6)
print("t2:", t1(2, 6))

#----t2: (8, 2, 6)

1.6 变量作用域

变量起作用的范围,根据范围大小分为局部变量和全局变量
局部变量:
    在函数体内部和函数定义处定义的变量
    仅在当前函数体内部有效,函数执行结束,局部变量的生命周期结束
全局变量:
global关键字   作用:声明函数内使用的变量是全局变量
    在函数体外定义的变量
    整个程序运行结束,全局变量的生命周期结束

a = 234  # 定义全局变量 a = 234


def test(n1, n2):  # 定义函数 test(n1, n2)
    num = n1 + n2  # 局部变量,仅在函数内有效
    a = 567  # 创建同名局部变量a,覆盖全局a
    global b  # 声明b是全局变量(若不存在则创建)
    b = 12345  # 修改全局变量b的值
    print("a1:", a)  # 打印局部变量a
    print("b1:", b)  # 打印局部变量a


print("qwer")  # 第一个执行的打印语句, 输出字符串
test(2, 3)  # 函数调用
# print("num:", test(3, 5))
print("a2:", a)  # 输出全局变量a
print("b2:", b)  # 输出全局变量b

#----qwer
#----a1: 567
#----b1: 12345
#----a2: 234
#----b2: 12345

#变量	 函数内部	函数外部	       说明
#a	      567	     234	    同名局部变量覆盖全局变量
#b	     12345	     12345	    global声明修改全局变量
#num	  存在	     不存在	     纯局部变量

1.7 匿名函数

没有名字的函数,只能用一次,一般在函数的函数体只有一句代码且返回值只有一个时,使用匿名函数来简化,使用 lambda 来创建匿名函数。

lambda 参数列表表达式

x = lambda a : a + 10
print(x(5))

#----15

y = lambda n1, n2: n1 + n2
print(y(3, 5))
print((lambda n1, n2: n1 + n2)(32, 52))

#----15
#----8
#----84

2 模块与包

2.1 模块

在 Python 中的模块(Module)是一个包含 Python 定义和语句的文件,文件名就是模块名后加上 .py 后缀。在我们编程的时候,先创建了一个 .py 文件,这个文件就称为一个模块(Module)。
在模块中可以直接存放变量、函数,类、可执行的代码。
我们封装函数用的是 def , 封装类用的是 class 。而我们封装模块,是不需要任何语句的。模块最大的好处就是大大提高了代码的可维护性。
编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括 Python 内置的模块和来自第三方的模块。
使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。

2.1.1 import 语句:

想在b.py文件中,使用a.py文件,需要在b.py文件中使用import语句:
impot a

完整语句:在名为a.py文件有一个test函数想去b.py文件中使用,需要在同一级目录创建两个文件

在a.py文件中写函数

def test(name):
    print("Hello, " + name)

在b.py文件中使用 test 函数

导入名为 b 的模块,并调用 test 函数:
import b

b.test("Bill")

2.1.2 from....import

在Python中,导入一个模块的方法我们使用的是 import 关键字,这样做是导入了这个模块,并没有导入模块中具体的某个属性或方法。而我们想直接导入某个模块中的某一个功能,也就是属性和方法的话,我们可以使用 from···import 语句。

语法:from md import name1[, name2[, ... nameN]]

from 绝对路径(package.subpackage.md3)import name1

绝对路径:从调用包的同级包的上一级开始写

在a.py文件中写函数

def test(name):
    print("Hello, " + name)


def hello():
    print("Hi")

在b.py文件中使用 test  hello 函数

from a import test, hello

hello()
test("Bill")

模块导入

导入方式语法使用示例特点
完整导入import module_nameimport mymodule需使用模块名前缀
别名导入import module_name as aliasimport mymodule as mm简化长模块名
部分导入from module import name1, name2from mymodule import greet直接使用对象
全部导入from module import *from mymodule import *导入所有对象(不推荐)

2.2 包

随着模块数量的增加,把所有的模块不区分放到一起很不合理,Python为我们提供一种把模块组织到一起的方法,即创建一个包。因为包是模块,所以包的使用和普通模块一样
包是包含多个模块的文件夹,必须包含:一个__init__.py文件和多个模块文件或子包

package/
├── __init__.py
├── md1.py
├── md2.py
└── subpackage/
    ├── __init__.py
    └── md3.py

2.2.1 创建包

1.创建文件夹mypackage
2.在文件夹中创建__init__.py文件(可以是空文件)
3.添加模块文件
  __init__.py的作用:
   3.1标识当前目录是一个Python包
   3.2可以包含包初始化代码
   3.3定义__all__变量控制from package import *的行为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值