一、生成器和迭代器

1.列表生成

>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a = map(lambda x:x+1, a)
>>> a
<map object at 0x101d2c630>
>>> for i in a:print(i)
...
3
5
7
9
11或者>>> a = [i+1 for i in range(10)]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

1 data = [1,2,3,4,5,6,7,8]
2 r = [i*2 if i>4 else i for i in data]
3 print(r)

2.创建生成器  

生成器作用是不占用空间,使用哪一个调用即可,不使用就不调用。

1 >>> g = (x * x for x in range(10))
2 >>> g
3 <generator object <genexpr> at 0x1022ef630>

 1 >>> g = (x * x for x in range(10))
 2 >>> for n in g:
 3 ...     print(n)
 4 ...
 5 0
 6 1
 7 4
 8 9
 9 16
10 25
11 36
12 49
13 64
14 81

View Code

1 def fib(max):
2     n, a, b = 0, 0, 1
3     while n < max:
4         print(b)
5         a, b = b, a + b
6         n = n + 1
7     return 'done'

 1 def fib(num):
 2     count = 0
 3     a,b = 0,1
 4     while count<num:
 5         a,b = b,a+b
 6
 7         count+=1
 8         yield a      #yield表示返回a  但不会终止
 9     print("done....")
10 f = fib(10)
11 for i in f:print(i)

generator和函数的执行流程的区别:函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

我们基本不会用next()来获取下一个返回值,而是直接使用for循环来迭代

3.利用生成器实现单线程并发运算

 1 def consumer(name):
 2     print("%s 准备吃包子啦!"%name)
 3     while True:
 4         baozi=yield
 5         print("包子[%s]来了,被[%s]吃了" %(baozi,name))
 6
 7 def producer(name):
 8     c=consumer("A")
 9     c2=consumer("B")
10     c.__next__()
11     c2.__next__()
12     print("老子开始做包子啦!")
13     for i in range(10):
14         time.sleep(1)
15         print("做了2个包子")
16         c.send(i)
17         c2.send(i)
18 producer("alex")

4.迭代器

可以直接用作for循环的对象统称可迭代对象:Iterable

可以使用isinstance()判断一个对象是否是Iterable对象:

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

总结:

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

二、装饰器

要求不改变原代码的情况下,遵循开放-封闭原则,对原函数进行包装扩展功能。

核心:1.@+函数 会自动执行@函数,并将被装饰的函数作为参数传递。
         2.将@函数的返回值重新赋值给被装饰的函数。

 1 user_status = False  # 用户登录了就把这个改成True
 2 def login(func):  # 把要执行的模块从这里传进来
 3     def inner(*args, **kwargs):  # 再定义一层函数
 4         _username = "alex"  # 假装这是DB里存的用户信息
 5         _password = "abc123"  # 假装这是DB里存的用户信息
 6         global user_status
 7         if user_status == False:
 8             username = input("user:")
 9             password = input("pasword:")
10             if username == _username and password == _password:
11                 print("welcome login....")
12                 user_status = True
13             else:
14                 print("wrong username or password!")
15         if user_status == True:
16             func(*args, **kwargs)  # 看这里看这里,只要验证通过了,就调用相应功能
17     return inner  # 用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数
18 def home():
19     print("---首页----")
20 @login
21 def america():
22     print("----欧美专区----")
23 def japan():
24     print("----日韩专区----")
25 # @login
26 def henan(style):
27     print("----河南专区----")
28 home()
29 america()
30 japan()
31 henan("3p")

通过装饰器权限控制的实例

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # Author:Liumj
 4 USER_INFO = {}
 5 def check_login(func):
 6     def inner(*args,**kwargs):
 7         if USER_INFO.get('is_login'):
 8             ret = func(*args,**kwargs)
 9             return ret
10         else:
11             print("请登录")
12     return inner
13 def check_admin(func):
14     def inner(*args,**kwargs):
15         if USER_INFO.get('user_type') == 2:
16             ret = func(*args,**kwargs)
17             return ret
18         else:
19             print("无权查看")
20     return inner
21 @check_admin
22 @check_login
23 def index():
24     print('Index')
25 @check_login
26 def home():
27     print('home')
28
29 def login():
30     user = input('请输入用户名:')
31     if user == 'admin':
32         USER_INFO['is_login'] = True
33         USER_INFO['user_type'] = 2
34         print("超级管理员登陆成功!")
35     else:
36         USER_INFO['is_login'] = True
37         USER_INFO['user_type'] = 1
38
39
40 def main():
41     while True:
42         inp = input("1,登陆: 2.查看信息: 3.超级管理员 \n>>>" )
43         if inp == "1":
44             login()
45         elif inp == "2":
46             home()
47         elif inp == "3":
48             index()
49 main()

三、常用模块

n个 .py 文件组成的代码集合就称为模块。

模块分为:内置模块(标准库)、自定义模块、开源模块

1.OS模块

 1 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
 2 os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
 3 os.curdir  返回当前目录: ('.')
 4 os.pardir  获取当前目录的父目录字符串名:('..')
 5 os.makedirs('dirname1/dirname2')    可生成多层递归目录
 6 os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
 7 os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
 8 os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
 9 os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
10 os.remove()  删除一个文件
11 os.rename("oldname","newname")  重命名文件/目录
12 os.stat('path/filename')  获取文件/目录信息
13 os.sep    输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
14 os.linesep    输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
15 os.pathsep    输出用于分割文件路径的字符串
16 os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
17 os.system("bash command")  运行shell命令,直接显示
18 os.environ  获取系统环境变量
19 os.path.abspath(path)  返回path规范化的绝对路径
20 os.path.split(path)  将path分割成目录和文件名二元组返回
21 os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素
22 os.path.basename(path)  返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
23 os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
24 os.path.isabs(path)  如果path是绝对路径,返回True
25 os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
26 os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
27 os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
28 os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
29 os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间

2.sys模块

1 sys.argv           命令行参数List,第一个元素是程序本身路径
2 sys.exit(n)        退出程序,正常退出时exit(0)
3 sys.version        获取Python解释程序的版本信息
4 sys.maxint         最大的Int值
5 sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
6 sys.platform       返回操作系统平台名称
7 sys.stdout.write('please:')
8 val = sys.stdin.readline()[:-1]
9  

四、序列化和反序列化

json,用于字符串和python数据类型之间的转换

pickle,用于python特有的类型和python的数据类型之间进行转换

Json模块提供了四个功能:dumps、dump、loads、load

pickle模块提供了四个功能:dumps、dump、loads、load

实例用法

 1 import json
 2 data = {
 3     "name":"alex",
 4     "age":22,
 5     "sex":"M"
 6 }
 7 f = open("data.txt","w",encoding="utf-8")
 8 #f.write(json.dumps(data))  #dumps用法
 9 json.dump(data,f)    #dump用法
10 f.close()
11
12
13
14 import json
15 f = open("data.txt",encoding="utf-8")
16 #d = json.loads(f.read())   #loads用法
17 d = json.load(f)    #load用法
18 print(d,type(d))

四、开发规范

设计好目录结构

优点:

可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等。从而非常快速的了解这个项目。

可维护性高: 定义好组织规则后,维护者就能很明确地知道,新增的哪个文件和代码应该放在什么目录之下。这个好处是,随着时间的推移,代码/配置的规模增加,项目结构不会混乱,仍然能够组织良好。

目录组织方式:

Foo/
|-- bin/
|   |-- foo
|
|-- foo/
|   |-- tests/
|   |   |-- __init__.py
|   |   |-- test_main.py
|   |
|   |-- __init__.py
|   |-- main.py
|
|-- docs/
|   |-- conf.py
|   |-- abc.rst
|
|-- setup.py
|-- requirements.txt
|-- README

简要解释一下:

  1. bin/: 存放项目的一些可执行文件,当然你可以起名script/之类的也行。
  2. foo/: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/存放单元测试代码; (3) 程序的入口最好命名为main.py
  3. docs/: 存放一些文档。
  4. setup.py: 安装、部署、打包的脚本。
  5. requirements.txt: 存放软件依赖的外部Python包列表。
  6. README: 项目说明文件。

readme 目的是能简要描述该项目的信息,让读者快速了解这个项目。

它需要说明以下几个事项:

  1. 软件定位,软件的基本功能。
  2. 运行代码的方法: 安装环境、启动命令等。
  3. 简要的使用说明。
  4. 代码目录结构说明,更详细点可以说明软件的基本原理。
  5. 常见问题说明。

我觉得有以上几点是比较好的一个README。在软件开发初期,由于开发过程中以上内容可能不明确或者发生变化,并不是一定要在一开始就将所有信息都补全。但是在项目完结的时候,是需要撰写这样的一个文档的。

转载于:https://www.cnblogs.com/liumj0305/p/6039599.html

Python基础知识学习_Day5相关推荐

  1. Python 基础知识学习笔记——NumPy

    Python基础知识学习笔记--NumPy 与 matlab 优秀的矩阵运算类似,python 提供了 numpy 库,这对熟悉 matlab 的用户来说非常友好.向量.矩阵和多维数组是数值计算中必不 ...

  2. Python 基础知识学习笔记——OpenCV(1)

    Python 基础知识学习笔记--OpenCV(1) OpenCV是一个开源的跨平台计算机视觉和机器学习软件库,它轻量而且高效,被广泛的使用. 整理一下OpenCV学习笔记,以防忘记. 文章目录 Py ...

  3. Python基础知识学习笔记——Matplotlib绘图

    Python基础知识学习笔记--Matplotlib绘图 整理python笔记,以防忘记 文章目录 Python基础知识学习笔记--Matplotlib绘图 一.绘图和可视化 1.导入模块 2.一个简 ...

  4. python基础知识学习笔记(2)

    python基础知识学习笔记(2) 整理一下python基础知识,以防忘记 文章目录 python基础知识学习笔记(2) python简洁的一行代码 python简洁的一行代码 1.交换两个变量 # ...

  5. python基础知识学习笔记(1)

    python 基础知识学习笔记(1) 总结一下Python基础知识,以防忘记. 文章目录 python 基础知识学习笔记(1) 一.起步 1.python安装与编译环境 二.变量和简单数据类型 三.列 ...

  6. Python基础知识学习笔记(一)

    Python基础知识学习笔记(一) 文章目录 Python基础知识学习笔记(一) (一) 认识python 1.注释 2.变量及类型 3.关键字(标识符) (1)什么是关键字? (2)查看关键字 (3 ...

  7. python基础知识学习总结

    python基础知识学习总结 从零开始学习python,已经学习完python相关的基础教程,学习地址详见:http://www.runoob.com/python/python-tutorial.h ...

  8. 初学者入门级!Python基础知识学习,纯干货【建议收藏】

    注释方法 # 单行注释 ''' 多行注释 ''' 数据类型 关键字 名称 示例 chr 单个字符 '', 'd' str 字符串(多个chr) 'dd', '你好' int 整数 1,2,3,4 fl ...

  9. 【python基础知识学习(6)】面向对象编程

    一.面向对象编程 VS 面向过程编程 (1)面向过程:根据业务逻辑从上到下写代码 (2)面向对象:将数据与函数绑定到一起,分类进行封装,每个程序员只要负责分配给自己的分类,这样能够更快速的开发程序,减 ...

最新文章

  1. 2021年需要学习Python的自动化测试框架有哪些?你知道吗?
  2. Eclipse中server启动超时的解决方法
  3. Android屏幕信息获取
  4. 为什么要用相对论为GPS导航提供修正
  5. TreeView查获节点并选中节点
  6. 【shell】 初次接触shell编程,记录一下遇到的问题
  7. 如何辨别二逼互联网公司!?
  8. linux内核的nfs实现框架
  9. C++中默认选中预编译头#includestdafx.h作用
  10. linux xxx is not in the sudoers file.This incident will be reported.的解决方法
  11. A-PDF Watermark
  12. matlab泊松分布实现
  13. 关于柔性显示器工作原理及发展前景的探究
  14. fastJson与String、对象、集合之间相互转换
  15. Pacbio测序原理以及SMRT bell文库构建流程简述
  16. 学习淘淘商城第三十四课(在业务逻辑中添加缓存)
  17. Pycharm的快捷键
  18. 京东方校园招聘页面重构
  19. 在微型计算机中 多媒体信息包括,公务员考试常识题:1、具有多媒体功能的微型计算机系统中,常用的CD-ROM是...
  20. 进入Oracle企业管理器

热门文章

  1. 计算机和路由器连接后IP地址受限制或无连接情况的处理
  2. 爱情第七课,被爱的秘密
  3. 使用MySQL组复制的限制和局限性
  4. HDU 2564 词组缩写
  5. 第五章:面向对象(上)
  6. Android中的资源访问
  7. 个人管理:简单,我微博中的一句话,总有你喜欢的
  8. Kotlin项目实践指南(上)
  9. 尽快安装修补程序!微软 Word 漏洞影响上百万人
  10. @ResponseBody