在pycharm中,创建的.py文件,就是一个模块。
优点:
① 在模块中,不但可以直接存放变量,还可以存放函数以及类
② pycharm中封装函数使用def,封装类使用class。在封装模块时,不需要使用任何语句。
③ 模块大大提高了代码的可维护性
④ 编写代码时,可以从其他模块中引用函数等,不必再重新编写,比如导入python内置的模块和来自第三方的模块
⑤使用模块可以避免函数名和变量名的冲突。相同名字的函数和变量可以分别存在不同的模块中。在编写代码时,不必考虑名字与其他模块冲突,但尽量不要与内置函数名字冲突。
一、模块的使用
1.import 语句
例如,可以在一个B.py文件中,导入A.py文件的函数,需要在B.py文件中使用import语句。
import A
在同一目录下创建A.py文件和B.py文件
A.py文件中
def A():
print("hi,I\'m A")
A()
B.py文件中
import A
def B():
print("hi,I\'m B")
B()
通过在B.py文件中import A ,实现 A.py文件中函数功能
2.from...import...
直接导入某个模块的某个功能
A.py文件中
def A():
print("hi,I\'m A")
因为没有去执行A()函数,所以没有输出结果
B.py文件中
from A import A
def B():
print("hi,I\'m B")
B()
A()
这种方法可以在B.py文件中调用A.py文件中的函数A( ),来实现输出A的语句
二、python中的包
通过创建python软件包,将多个模块组织到一起。包也是有模块组成,导入时和模块的导入一样
创建python软件包时,会自动创建一个__init__.py的模块(文件)
三、python常用的标准库
1. os:os 模块提供了许多与操作系统交互的函数,例如创建、移动和删除文件和目录,以及访问环境变量等。
2. sys:sys 模块提供了与 Python 解释器和系统相关的功能,例如解释器的版本和路径,以及与 stdin、stdout 和 stderr 相关的信息。
3. time:time 模块提供了处理时间的函数,例如获取当前时间、格式化日期和时间、计时等。
4. datetime:datetime 模块提供了更高级的日期和时间处理函数,例如处理时区、计算时间差、计算日期差等。
5. math:math 模块提供了数学函数,例如三角函数、对数函数、指数函数、常数等。
6. json:json 模块提供了 JSON 编码和解码函数,可以将 Python 对象转换为 JSON 格式,并从 JSON 格式中解析出 Python 对象。
7. numpy:用于维度数组计算的库
8. opencv:用于计算机视觉的库
9. matplotlib:用于数据可视化的库(绘图)
10. scikit-learn:用于机器学习的库
11. tensorflow:用于深度学习的库
12. threading:用于设置多线程的库
四、异常处理机制
1.pyhton中常见的异常类型
KeyboardInterrupt:用户主动结束程序触发,控制台按结束按钮
AttributeError:访问对象没有的属性
TypeError:操作非法类型数据
IndexError:序列中没有索引
KeyError:字典中没有的键
Exception:通用的异常类
2.异常处理方式
try,except,else,finally等关键字组合成的不同的异常处理方式,其中try和except是异常处理机制的核心
格式:
try:
# 有可能发生异常的代码
except 某个异常:
# 异常发生后执行的代码
else:
# 没有异常发生,try执行后执行
finally:
# 不管是否捕获到异常,最后都执行
list1 = [1, 2, 3, 4, 5]
try:
print(list1[10])
except IndexError:
print("list1中未查询到此下标所在的元素")
else:
print("代码正常运行")
finally:
print("代码执行完毕")
print(list1)
在上例代码是我们知道异常类型情况下,list1没有下标为10的元素,所以一定存在异常,会执行异常发生后的代码即except部分,finally不管异常是否存在都会执行。
有时我们没法预测异常类型,可以用一下方法
格式:
try:
# 有可能发生异常的代码
except Exception as e: # 捕获所有的异常
# 异常发生后执行的代码
else:
# 没有异常发生,try执行后执行
finally:
# 不管是否捕获到异常,最后都执行
list1 = [1, 2, 3, 4, 5]
try:
print(list1[10])
except Exception as e:
print("error")
print(e)
else:
print("代码正常运行")
finally:
print("代码执行完毕")
print(list1)
五、迭代器与生成器
迭代是Python访问集合中元素的一种方式,迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合第一个元素开始访问,直到所有元素被访问完结束。迭代器只能往前不会后退。
通过索引的方式进行迭代取值,实现简单,但只适用于序列类型:字符串、列表、元组。
对于没有索引的字典、集合等非序列类型,要用不依赖索引来进行迭代取值的方法,使用迭代器。
字符串、列表、元组、字典、集合、打开的文件都是可迭代对象
1.迭代器的两个基本方法
iter( ) 和next( )
list1 = [1, 2, 3, 4, 5]
it = iter(list1)
print(next(it))
print(next(it))
或者使用for 循环遍历
list1 = [1, 2, 3, 4, 5]
it = iter(list1)
for i in it:
print(i)
2.创建一个迭代器
把一个类作为一个迭代器使用,需要在类里实现两个方法iter()和next()
iter() 方法返回一个特殊的迭代器对象,这个迭代器对象实现了 next() 方法并通过 StopIteration 异
常标识迭代的完成。
class Number:
def __iter__(self):
self.a = 10
return self
def __next__(self):
b = self.a
self.a += 10
return b
class_number = Number()
class_iter = iter(class_number)
print(next(class_iter))
print(next(class_iter))
print(next(class_iter))
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在__next__()方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代
class Number:
def __iter__(self):
self.a = 10
return self
def __next__(self):
if self.a <= 50:
b = self.a
self.a += 10
return b
else:
print("迭代结束")
raise StopIteration
class_number = Number()
class_iter = iter(class_number)
print(next(class_iter))
print(next(class_iter))
print(next(class_iter))
print(next(class_iter))
print(next(class_iter))
与上一程序不同的是,上一个程序中可以无限next( )迭代增加数字,而这个程序加了限制,再通过StopIteration异常来结束迭代
3.生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐
步产生值,而不是一次性返回所有结果。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器
就是一个迭代器。
每次使用 yield 语句生产一个值后,函数都将暂停执行,等待被重新唤醒。
yield 语句相比于 return 语句,差别就在于 yield 语句返回的是可迭代对象,而 return 返回的为不
可迭代对象。
然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执
行,直到再次遇到 yield 语句。
def fun(n):
while n > 0:
yield n
n -= 1
# 创建生成器对象
g1 = fun(5)
# 通过迭代生成器获取值
print('next方法:', next(g1))
print('next方法:', next(g1))
# 使用 for 循环迭代生成器
for i in g1:
print('for循环:', i)
在这个代码中,fun 函数是一个生成器函数。它使用 yield 语句逐步产生从 n 到 1 的倒序数字。在
每次调用 yield 语句时,函数会返回当前的倒序数字,在下一次调用时从上次暂停的地方继续执
行。
创建生成器对象并使用 next() 函数或 for 循环迭代生成器,我们可以逐步获取生成器函数产生的
值。在这个例子中,我们首先使用 next() 函数获取前两个倒序数字,然后通过 for 循环获取剩下的
三个倒序数字。
生成器函数的优势是它们可以按需生成值,避免一次性生成大量数据并占用大量内存。此外,生成
器还可以与其他迭代工具(如for循环)无缝配合使用,提供简洁和高效的迭代方式