python基础,python第四课

第四课学习的主要内容有生成器,迭代器,pyton装饰器,python开发规范,Json & pickle 序列化与反序列化

生成器

列表生成式

>>> b = [i+1 for i in range(0,10)]
>>> b
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

生成器(Generator)

生成器的一种简单写法,把上面的列表生成式的[],换成()就成了生成器了,python3.0中通过__next__调用

>>> b = (i+1 for i in range(10))  
>>> b
<generator object <genexpr> at 0x0000000003088518>
>>> b.__next__()
1>>> b.__next__()
2
>>> b.__next__()
3
>>> b.__next__()
4
>>> b.__next__()
5
>>> b.__next__()
6
>>> b.__next__()
7
>>> b.__next__()
8
>>> b.__next__()
9
>>> b.__next__()
10
>>> b.__next__()  
Traceback (most recent call last):  #当调用生成器数据超出范围时,解释器会抛出异常,可以通过异常处理来解决
  File "<pyshell#39>", line 1, in <module>
    b.__next__()
StopIteration
>>> b = (i+1 for i in range(10))
>>> while True:
    try:
        a=b.__next__()
        print(a)
    except StopIteration as e:
        print("end")
        break

1
2
3
4
5
6
7
8
9
10
end

用一个函数来实现斐波那契数列(Fibonacci),如:1, 1, 2, 3, 5, 8, 13, 21, 34, ...  ,除第一个和第二个数外,任意一个数都等于前两个数相加的和。

 1 >>> def fib(max):
 2     a=0
 3     b=1
 4     n = 0
 5     while n < max:
 6         print(b)
 7         a,b = b,a + b    #该行等于 t = (b,a+b) ,t[0] = b ,t[1]=a+b
 8         n += 1
 9     return "done"
10
11 >>> f=fib(10)
12 1
13 1
14 2
15 3
16 5
17 8
18 13
19 21
20 34
21 55
22 >>> print(f)
23 done

把上面实现斐波那契数列的函数中的print(b) 改为 yield b 就成了生成器

>>> def fib(max):
    a=0
    b=1
    n = 0
    while n < max:
        yield b
        a,b = b,a + b
        n += 1
    return "done"

>>> fib(10)
<generator object fib at 0x00000000030AACA8>

上面生成器执行过程与函数过程有所不同,函数执行到return返回,生成器在执行过程中遇到yield 就返回停止执行,当下次再次执行,程序从yield 的位置继续执行

通过yield实现单线程下的并行计算效果

import time
#消费者
def consumer(name):
    print("%s准备好吃包子了"%name)
    while True:
        baozi = yield
        print("%s吃%s个包子."%(name,baozi))
#生产者
def producer(name):
    a = consumer("A")
    b = consumer("B")
    a.__next__()    #初始化
    b.__next__()    #初始化
    print("%s要开始做包子了:"%name)
    for i in range(1,10):   #做包子
        time.sleep(1)
        a.send(i)           #做一个包子发送给a,yield = 1,继续执行,
        b.send(i)           #做一个包子发送给b,并执行

producer("zhangsan")

迭代器

for循环的数据类型:

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yield的generator function。

  • 可迭代(Iterable):可以直接作用于for循环的对象。
  • 迭代器(Iterator):可以被next()函数调用并不断返回下一个值的对象。

可以使用isinstance方法Iterable和Iterator

#判断是否是可迭代对象>>> from collections import Iterable>>> isinstance([],Iterable)
True
>>> isinstance({},Iterable)
True>>> isinstance((x for i in  range(10)),Iterable)
True
#判断是否是迭代器
>>> from collections import Iterator
>>> isinstance([],Iterator)
False
>>> isinstance({},Iterator)
False
>>> isinstance((x for i in range(10)),Iterator)
True

可迭代对象可以通过iter()变成迭代器

>>> isinstance(iter([1,2,3,4]),Iterator)
True

装饰器

定义:本质是函数,就是为了其他函数添加附加的功能(装饰其他函数)。

原则:

  1. 不能修改被装饰的函数的源代码
  2. 不能修改被装饰的函数的调用方式

实现装饰器需要掌握的知识

  1. 函数即“变量”
  2. 高级函数

a:把一个函数名当做实参传给另外一个函数(在不修改被装饰函数源代码情况下为其添加功能)

b:返回值包含函数名(不修改函数的调用方式)

  3.嵌套函数

装饰器= 高阶函数+嵌套函数

装饰器普通版

import time
#装饰器
def timer(func):    #timer(test1)  func =test1
    def deco():
        start_time = time.time()
        func()
        stop_time = time.time()
        print("func run time is",stop_time - start_time)
    return deco #返回deco 内存地址

@timer          #test1 = timer(test1)
def test1():
    time.sleep(2)
    print("in the test1")
@timer
def test2():
    time.sleep(3)
    print("in the test2")

test1()
test2()

装饰器高潮版

user,passwd = "zhangxin","abc123"

def auth(auth_type):
    print(auth_type)
    def wrapper_auther(func):
        def wrapper(*args, **kwargs):
            if auth_type == "local":
                username = input("Please input username:").strip()
                password = input("Please input password:").strip()
                if user == username and passwd == password:
                    print("Login successful")
                    func(*args, **kwargs)
                    return  func
                else:
                    print("Account or password error")
            elif auth_type == "ldap":
                print("不会ldap")
        return wrapper
    return wrapper_auther  #

def index():
    print("Welcome to index")

@auth(auth_type = "local")        #装饰器加参数
def home():
    print("Welcome to home")
    return "from home"

@auth(auth_type = "ldap")
def setting():
    print("Welcome to setting")

index()
print(home())
setting()

json序列化与反序列化

json序列化

 1 import json
 2
 3 data = {
 4     "name":"zhangsan",
 5     "age": 28,
 6     "city":"beijing"
 7 }
 8 f = open("json file1","w",encoding="utf-8")
 9 #f.write(json.dumps(data))#序列化
10 json.dump(data,f) #json.dump(data,f) ==json.dump(data,f)
11 f.close()

json反序列化

import json

f = open("json file1","r",encoding="utf-8")
#data = json.loads(f.read()) #反序列化
data = json.load(f) # json.loads(f.read()) ==   json.load(f)
print(data)
f.close()

python开发目录规范

目录结构

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: 项目说明文件。

作业

ATM作业需求

  1. 额度 15000或自定义
  2. 实现购物商城,买东西加入 购物车,调用信用卡接口结账
  3. 可以提现,手续费5%
  4. 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息
  5. 支持多账户登录
  6. 支持账户间转账
  7. 记录每月日常消费流水
  8. 提供还款接口
  9. ATM记录操作日志
  10. 提供管理接口,包括添加账户、用户额度,冻结账户等。。。
  11. 用户认证用装饰器
时间: 2024-10-21 10:56:09

python基础,python第四课的相关文章

Python基础-Python流程控制

上篇文章 Python基础-基础使用 我们已经知道了Python解释器,Python的变量.和Python的输入输出.Python的注释和字符集,这篇文章,我们主要讲Python的流程控制 本文防盗链:http://python789.blog.51cto.com Python基础-Python流程控制 1.条件判断 1.1.if基本使用 if就是一个条件判断的,当满足不同样的条件的时候执行不同的操作,如法如下: if 条件1:     满足条件1 代码框 elif 添加2:     满足条件2

python基础----&gt;python的使用(三)

今天是2017-05-03,这里记录一些python的基础使用方法.世上存在着不能流泪的悲哀,这种悲哀无法向人解释,即使解释人家也不会理解.它永远一成不变,如无风夜晚的雪花静静沉积在心底. Python的基础学习 一.python中函数作为参数 import math def add(x, y, f): return f(x) + f(y) print(add(25, 9, math.sqrt)) # 8.0 二.python引用自定义模块 在同目录下面定义两个文件huhx.py和huhx5.p

重学Python - Day 05 - python基础 -&gt; python的文件操作:r、w、a、r+、a+ 、readline、readlines 、flush等常用的文件方法

文件的读操作 示例: 1 print("->文件句柄的获取,读操作:") 2 3 f = open('无题','r',encoding='utf8') 4 d = f.read() 5 f.close() 6 print(d) 7 8 print('->例二:') 9 f = open('无题','r',encoding='utf8') 10 e = f.read(9) 11 f.close() 12 print(e) 13 #python3中,文件中一个中英文都占位1 运

重学Python - Day 01 - python基础 -&gt; python版本选择+第一个小程序

题外话: Python版本:最新的3.6 安装注意点:勾选添加路径后自定义安装到硬盘的一级目录,例如本人的安装路径: F:\Python 原因:可以自动添加python环境变量,自动关联.py文件,其余的优点很多,例如学习selenium的,使用pip install selenium命令就可以安装selenium 3了,虽然python webdriver的自动化还是2.7居多,但是3.0会是未来 闲言碎语以后再说,现在正式开始学习Python,没办法,不会编程的测试在工作中好吃力,学不会py

Linux零基础入门第四课

根据直播讲义整理的内容,从第四课开始.前三课的内容若后面有精力会一并整理进来. 文件的基本操作(上) 创建.删除.复制.移动和重命名 touch命令创建文件 语法 >$ touch file0 [file1 file2 ...] >$ touch file{0..9}.txt touch命令可以创建空文件,将文件名作为参数即可.传递多个文件名可同时创建多个文件. 若使用 file{0..9} 作为参数,将自动创建10个空文件,名字分别为file0.txt.file1.txt.....file9

Python基础笔记系列四:工具的安装与配置

本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 一开始是没有打算写工具这篇的,后来发现在某些情况下会遇到一些奇怪的问题,这里记录一下. 环境基础我是用的是windows 10操作系统python版本:python2.7  地址-->https://www.python.org/downloads/ Sublime Text3:地址-->https://www.sublimetext.com/ 安装python的坑:直

Python基础(十四)-并发编程

一.操作系统 参考文档:https://www.cnblogs.com/yuanchenqi/articles/6248025.html 二.进程与线程 2.1.进程简介 进程:一个程序在一个数据集上的一次动态执行过程,一般由程序.数据集.进程控制块三部分组成 程序:用来描述进程要完成哪些功能以及如何完成 数据集:程序在执行过程中所需要使用的资源 进程控制块:记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系 统感知进程存在的唯一标志 2.2.线程 线程:轻量级进

Python基础(十四)

今日主要内容 装饰器扩展 有参装饰器 多个装饰器装饰一个函数 递归 一.装饰器扩展 (一)含有参数的装饰器 先来回顾一下装饰器的标准模式 def wrapper(fn): def inner(*args, **kwargs): """扩展内容""" ret = fn(*args, **kwargs) """扩展内容""" return inner @wrapper def func():

Python学习,第四课 - 字符串相关操作

这次主要说说Python中字符串的使用方法详解 capitalize 首字母大写 print('chengshou'.capitalize()) #输出结果:Chengshou title 修改成标题模式 - 既单词的首字母大写 print('cheng shou'.title()) #输出结果:Cheng Shou count 查询字符在字符串中的个数 print('chengshou'.count("h")) #输出结果:2 center 字符不足数量则补齐 print('chen

Python基础学习(四)

Python 集合: set 顾明思义,就是个集合,集合的元素是唯一的,无序的.一个{ }里面放一些元素就构成了一个集合,set里面可以是多种数据类型(但不能是列表,集合,字典,可以是元组) 它可以对列表里面的重复元素进行去重 list1 = [1,2,3,23,1,4,2] list1 = set(list1) 集合的关系测试: a = {1,2,3,4,5} b = {1,3,5,7,9} a.symmetric_difference(b) #对称差集 a.difference(b) #差集