07包、模块、函数与变量作用域

7-1 while循环与使用场景
循环、循环语句
主要看看两个循环 while和for

先看while

'''
CONDITION = True
while CONDITION:
    print('i am while') #按ctrl + c 结束运行终端里的循环
'''
counter = 1    # 在递归的环境里用while的情况多点
while counter <= 10:
    counter += 1
    print(counter)
else:
    print('EOF')

while不仅可以单独使用,还可以和else一起使用!

7-2 for与for-else循环

'''
主要是用来遍历/循环  序列或者集合、字典

for target_list in expression_list: #for循环的形式
    pass

'''
# 简单的for循环
a = ['apple','orange','banana','grape']
for x in a:
    print(x)

如下列表中打印所有的列表元素

a = [['apple','orange','banana','grape'],(1,2,3)]
for x in a:
    print(x) 这种方法打印的是大列表中的一个列表和元组,并不是所有元素

看下列方法。称为循环嵌套!!!

a = [['apple','orange','banana','grape'],(1,2,3)]
for x in a:
    for y in x:
        print(y)

打印的结果如图

image

默认的打印结果是按列排放的,那么如何改成按行排放呢?

a = [['apple','orange','banana','grape'],(1,2,3)]
for x in a:
    for y in x:
        print(y,end = '')

打印结果按行排放

image

# for也可以用来和else搭配

a = [['apple','orange','banana','grape'],(1,2,3)]
for x in a:
    for y in x:
        print(y)
else:
    print('fruit is gone')
#当遍历完才执行else
# 想一想,如何终止for循环? a = [1,2,3],当x 遍历到2的时候就终止,怎么操作?
a = [1,2,3]

for x in a:
    if x == 2:
        break #一旦遇到break,就会跳出循环,后面的都不会被遍历了(强行终止)
    print(x)

# 想一想,如何终止for循环? a = [1,2,3],当x不遍历到2,直接遍历到3,怎么操作?

for x in a:
    if x == 2:
        continue#一旦遇到continue,当前的不会被执行,后续的还是会被执行出来
    print(x)

看看下面的代码,回答问题
for x in a:
    if x == 2:
        break 
    print(x)
else:
    print('EOF')

上述代码中,通过break强制性打断的,而非正常结束的,那么后面的else语句是不会再执行了。
如果是continue,那么else语句将继续会被执行

再来看一个问题,想一想为什么?

a = [['apple','orange','banana','grape'],(1,2,3)]
for x in a:
    for y in x:
        if y == 'orange':
            break
        print(y)
else:
    print('fruit is gone')

image
a = [['apple','orange','banana','grape'],(1,2,3)]
for x in a:
    if 'banana' in x:
        break
    for y in x:
        if y == 'orange':
            break
        print(y)
else:
    print('fruit is gone')

这段代码却什么也没打印出来!!
出现上述两种情况的原因是因为有两个嵌套的for循环,并不是一个for循环,第一段代码跳出的是内部的循环,外部的循环照样打印,所以并不影响123的打印,和else配对的是外面的循环,里面的循终止,并不影响else的打印
第二段代码是表示外部终止,所以什么都不会被打印!

7-3 for 与range

for x in range (0,10): # 0是起始,10是偏移量
    print(x)
#输出0,1,2,3,4,5,6,7,8,9
# 若果想打印的数字有间隔,并不是连续的数字,怎么办? 

for x in range (0,10,2): # 0是起始,10是偏移量  第三个参数2 表示步长,间隔多少的意思
    print(x)

#如果将间隔的数列按行排列怎么办?

for x in range (0,10,2): # 0是起始,10是偏移量  第三个参数2 表示步长,间隔多少的意思
    print(x,end = ' | ')    #  end = ' | '  表示按行排列

#如果想打印递减的等差数列怎么办?

for x in range (10,0,-2): # 10是起始,0是偏移量  第三个参数 -2 表示步长,间隔多少的意思
    print(x,end = ' | ')    #  end = ' | '  表示按行排列

#  思考题:有序列a = [1,2,3,4,5,6,7,8],也可能是无线长,打印相间隔的数字出来!

a = [1,2,3,4,5,6,7,8]
for i in range(0,len(a),2):

    print(a[i],end=' | ' )

# 上述方法挺好,但是用切片的方法可以起到同样的效果
 b = a[0:len(a):2]
 print(b)

image
image

7-4新篇章导言

会写代码,非常容易
难的是:高性能、封装性(可服用)、抽象
直白
美与不美

7-5Python工程的组织结构:包、模块、类

Python的项目组织结构
包(可以理解成文件夹)
模块(可以理解成文件)

函数、变量

image

7-6Python包与模块的名字

image

那么如何区分,不同包的同名模块呢?
采用命名空间 命名方式是:包的名字.模块的名字
如:seven.c4 six.c4
包下面可以有子包
如果想让一个文件夹编程Python的一个包,则必须含有init.py(本身就是个模块.这个模块的名字就是包名)文件
不能说一个文件夹就是包

7-7import导入模块

我们把公用的东西或者重复的东西提取出来放在同一个模块里,我们只要调用即可。
import t.c7 #(包名.模块名) import只能导入模块,不能导入变量
print(t.c7.a)#(包名.模块名.变量名)

以下有种快捷方法

import t.c7 as m # as 关键字可以把命名空间简化成一个很简单的字符
print(m.a)

7-8 from import 导入变量

导入的是具体的变量,可以简化

#from import 导入变量
# import 导入的模块
 
from module import a,def   # 可以是变量或者定义的函数

#如下两种方式都是可以的
from t.c7 import a
print(a)

from t import c7 #导入t包中的c7模块
print(c7.a) #导入模块



#如果要引用的变量过多,怎么办?看看下面的方法

from t.c7 import *  #(全部变量导入,不建议使用,导致引入不明确)
print(a)
print(b)
print(c)
#导入多个变量
#如果导入的变量过多,可以通过\来换行,python建议1行最多80个字符
#from c9  import a,b,v,v,c,c,c,c,c,v,v,v,b,f,f,d,d,d,d
#from c9 import a,b,v,\
#cccc.....两个效果相同
#推荐使用 from c9 import (a,b,c,
#d,d)也可以达到相同效果

2、Python中的包和模块有两种导入方式:精确导入和模糊导入

以上图为例,精准导入,假如A.py里有函数A1(),A2()。

此时B.py需要引用它们,可以如下:

from hello.A import A1,A2
假如方法比较多,或许会偷懒,用模糊导入:

from hello.A import *
all,则可以控制*所表示要引入的东西(模块,函数,类等):

如果将all里的sayA2去掉,B.py里就会报sayA2查找不到的错误。

image.png

image.png

7-9 init.py 的用法

当一个包被导入的时候,init.py首先会被自动执行
通常用于包初始化工作
导入模块

7-10 包与模块的几个常见错误

包的导入不是重复的
避免循环导入(在p1中导入p2,在p2中导入p1,重复循环报错)
【看视频看懵逼了】


image

7-13 name的经典应用


import sys
infos = dir(sys) #dir函数里传入参数,可以打印出想要查询模块的变量
print(infos)

image
if __name__ == '__main__':
    print('this is app')

# make a script both importable and executable 经典定义
print('this is a moudule')

image

也可以作为导入,打印结果如下:

import c15

image

你可能感兴趣的:(07包、模块、函数与变量作用域)