模块
test_m为模块文件,m为主文件名
将一个完整的程序分解成一个一个的小模块
作用:
1、方便开发和维护
2、模块可以复用
模块的导入方式:
1、import 模块名
2、import 模块名 as 别名 (当模块名称复杂或者不便于记忆是采用)
test_m
print('这是我的第一个模块')
m
import test_m
'''
这是我的第一个模块
'''
__name__的使用:
如果在模块test_m中出现,那么在主文件中则可以获取模块的名称,如果在主文件中使用,则提示当前文件是主文件.
test_m:
print('__name__')
m:
import test_m
'''
test_m
'''
主文件与模块的区别:直接run的文件是当前主文件,通过import导入的则是模块
模块的使用
主文件使用模块中的变量,格式:模块名.变量名
test_m:
a = 1
b = 2
m:
import test_m
print(test_m.a,test_m.b)
'''
1 2
'''
主文件使用模块中的函数,格式:模块名.变量名
test_m:
def test1():
print('test1')
def test2():
print('test2')
m:
import test_m
test_m.test1()
test_m.test2()
'''
test1
test2
'''
主文件使用模块中的类,格式:模块名.对象名
test_m:
class perpon:
def __init__(self):
self.name = '葫芦娃'
p = perpon
m:
import test_m
p = test_m.perpon()
print(p.name)
'''
葫芦娃
'''
主文件引入模块中的部分内容:
test_m:
class perpon:
def __init__(self):
self.name = '葫芦娃'
p = perpon
a = 1
b = 2
def test1():
print('test1')
m:
from test_m import a
from test_m import test1
test1()
print(a)
'''
test1
1
'''
from test_m import a
from test_m import test1
合并:from 模块名 import 变量,函数,类
根据需要进行引用,可以增加运算效率
m:
from test_m import *#主文件中用到哪个,就自己调用哪个,与全部引入有一定区别
test1()
print(a)
import 模块名与from 模块名 import *在主文件中的位置是有影响
test_m:
class perpon():
def __init__(self,name):
self.name = name
p = perpon('葫芦娃')
def test1():
print('test1')
a = 1
b = 2
m:
a = 4
import test_m
print(a)
'''
4
此时主文件中的a的值是对输出有影响的
'''
**如果使用from test_m import * 来引用,跟from test_m import *在a的前后有一定关系的
如果a在from test_m import 下面,则会影响输出的a的值,如果a在from test_m import 上面,则对输出a的值是没有影响的,不管对输出是否有影响,总有一个a的值是没有输出的,鉴于此需要引入指定模块中变量的引入
特定引用模块中内容:
格式:from 模块名 import 变量名 as 别名
test_m:
class perpon():
def __init__(self,name):
self.name = name
p = perpon('葫芦娃')
def test1():
print('test1')
a = 1
b = 2
m:
a = 4
from test_m import a as new_a
print(a)
print(new_a)
'''
4
1
'''
这样主文件和模块中a的值都不影响
if name’main’:妙用:在当前文件中可以正常执行,用于测试当前文件执行是否有误,但是被其他文件引用后,if name’main’:里面的代码则不会被执行
模块导入的总结:
1、import xxx
2、import xxx as yyy
3、from xxx import yyy,zzz,bbb
4、from xxx import *
5、from xxx import yyy as zzz
推导式
以列表推导式为例,因为列表使用非常广泛
语法:[变量 for 变量 in 旧列表] 或者 [变量 for 变量 in 旧列表 if 条件判断]
names = ['jerry','amy','tony','james','anny','mcheal','abc','nba']
r = [name for name in names if len(name)<=3]
print(r)
'''
['amy', 'abc', 'nba']
'''
names = ['jerry','amy','tony','james','anny','mcheal','abc','nba']
r = [name.capitalize() for name in names if len(name)<=3]#首字母大写
print(r)
'''
['Amy', 'Abc', 'Nba']
'''
DEMO::讲1-100之间能被3整除的,组成一个新的列表
r = [n for n in range(1,101) if n%3==0]
print(r)
生成器
通过推导式把符号要求的所有元素都会生成,这样就会消耗资源,生成器就是解决这样的问题,需要用到哪些就生成哪些,即一边循环一边使用的的机制
1、通过推导式生成生成器
2、格式是推导式,但是最外层是括号()
3、生成器获取元素方式
1、print(变量名.next())
2、print(next(变量名))
r = (n*3 for n in range(6) if n <5)
print(r.__next__())
print(next(r))
'''
0
3
'''
通过函数获得生成器
只要在函数中出现yield关键字,那么这个函数就是函数生成器
def fn():
num = 0
while True:
num +=1
yield num#生成器函数
a = fn()
print(a.__next__())
print(next(a))
迭代器
迭代:获取元素的一次过程
可迭代:可迭代对象(列表、集合、字典、字符串、元组、生成器等等)
迭代器:可以被next()函数调用并不断返回下一个值的对象称之为迭代器(iterator)
可迭代对象不一定是迭代器,但迭代器一定是迭代对象,
1、生成器是可迭代的,也是迭代器
2、列表是可迭代的,但是不是迭代器
通过iter()函数可以将可迭代的变成迭代器
from collections import Iterable
a = [1,2,3]
print(next(a))
'''
TypeError: 'list' object is not an iterator
'''
转换后:
from collections import Iterable
a = [1,2,3]
a = iter(a)#将可迭代的转换成可迭代器
print(next(a))
'''
1
'''
总结:迭代器主要分为2部分(一部分是可以直接使用的可迭代对象,一部分是需要通过iter()函数转换成迭代器的–>例如元组、列表等。