python第二章函数以及常用模块

装饰器

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

  原则:1.不能修改被装饰的函数的源代码

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

 实现装饰器的知识储备

1,函数即“变量”

2,高阶函数

  a:把一个函数名当做实参传给另一个函数

  b:返回值包含函数名

3,嵌套函数

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

import time
def timemer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        func(*args,**kwargs)
        stop_time=time.time()
        print(‘the func run time is %s‘ %(stop_time-start_time))
    return wrapper
@timemer
def test(name):
    time.sleep(1)
    print(‘in zhe test1 %s‘ %(name))

test("nihao")

上面代码可以看到运行test函数时 其实是去运行上面的timemer装饰器的内部wrapper函数了 真正执行test函数是在wrapper内部的func()这个函数运行

列表生成式

a=[i*2 for i in range(10)]

生成器

  

通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表的容量肯定是有限的,而且创建一个包含100万个元素的列表,不就占用很大的内存空间,如果我们仅仅需要访问前面几个元素那后面的绝大数元素占用的空间就白白浪费了所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在python中,这种一边循环一边计算的机制,成为生成器generator要创建一个generator 有很多方法。第一种方法很简单,只要把一个列表生成式的[]改成()就创建了一个生成器 generator生成器只有调用的时候才生成数据

  

 1 a=(i*2 for i in range(10))
 2 print(a)
 3 for i in a:
 4     print(i)
 5
 6 """
 7 可以将函数变成生成器
 8
 9 """
10 def fib(max):
11     n,a,b=0,0,1
12     while n<max:
13
14         a,b=b,a+b
15         n+=1
16         yield b
17
18 # 前面的两个数相加等于这个数本身
19 for i in fib(10):
20     print(i)

生成器 并行运算

 函数内加入 yield  可变成类似生成器的样子终止运行,__next__()可以执行下一句,yield 可以接收 send()传入的参数

import time
def consumer(name):
    print("%s 准备吃包子啦" %name)
    while True:
        baozi=yield

        print("包子[%s]来了,被[%s]吃了" %(baozi,name))

def producter(name):
    c=consumer(‘A‘)
    c2=consumer(‘b‘)
    c.__next__()
    c2.__next__()
    print("老子开始准备做包子啦")
    for i in range(10):
        time.sleep(1)
        print("做了两个包子")
        c.send(i)
        c2.send(i)

producter("大牛")
import time
def fib(max):
    n,a,b=0,0,1
    while n<max:
        time.sleep(1)
        a,b=b,a+b
        n+=1
        yield b

# 前面的两个数相加等于这个数本身
data=fib(10)

print(data.__next__())

print(data.__next__())
print(data.__next__())
print(data.__next__())
print("做点其他事情看看")
print(data.__next__())
print(data.__next__())
print(data.__next__())
print(data.__next__())
print(data.__next__())
print(data.__next__())

迭代器

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

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

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

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

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


1

2

3

4

5

6

7

8

9

10

11

>>> from collections import Iterable

>>> isinstance([], Iterable)

True

>>> isinstance({}, Iterable)

True

>>> isinstance(‘abc‘, Iterable)

True

>>> isinstance((x for in range(10)), Iterable)

True

>>> isinstance(100, Iterable)

False

而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

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

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


1

2

3

4

5

6

7

8

9

>>> from collections import Iterator

>>> isinstance((x for in range(10)), Iterator)

True

>>> isinstance([], Iterator)

False

>>> isinstance({}, Iterator)

False

>>> isinstance(‘abc‘, Iterator)

False

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数:


1

2

3

4

>>> isinstance(iter([]), Iterator)

True

>>> isinstance(iter(‘abc‘), Iterator)

True

你可能会问,为什么listdictstr等数据类型不是Iterator

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

小结

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

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

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

Python的for循环本质上就是通过不断调用next()函数实现的,例如:


1

2

for in [12345]:

    pass

实际上完全等价于:

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

 内置函数

#!/usr/bin/env/python
# -*- coding:utf-8 -*-
# Author:wanghui

"""
# 返回绝对值
"""

print(abs(-3))

"""
all(iterable) 判断可迭代对象中所有元素是否为真
"""
print(all([0,-1,3]))

"""
#any(iterable) 判断可迭代对象中所有元素中只要有一个为真 就为真
"""
print(any([0,0,0,1]))
"""
ascii 返回ascii码 并且返回的是字符串形式
"""
print(ascii("你好"))
print(ascii([1,2,"开外挂"]))
"""
bin 将十进制转换成二进制
"""
print(bin(2))
"""
bool 判断真假
"""
print(bool(""))

"""
bytes 将字符串转换成二进制字符,
字符串无法修改的 但是可以通过bytearray 将其转换成字符列表 就可以进行修改了
"""
a=bytes("abcde王辉",encoding="utf-8")

print(a)
b=bytearray("abcdef",encoding="utf-8")
b[0]=100
print(b)

"""
chr 输入数字 打印出对应的ascii字符
"""
print(chr(97))
"""
ord 输入字符,打印出对应的ascii字符的数字
"""
print(ord("a"))

"""
compile
"""
code="for i in range(10):print(i)"
print(code)
c=compile(code,‘‘,‘exec‘)
"""
exec可以执行的函数
"""
exec(c)

"""
eval使用比较简单
"""
print(eval("1+2"))

"""
匿名函数 lambda 可以处理简单的函数
"""
calc=lambda n:print(n)
calc("lambda函数")

"""
filter
一般和lambda 结合使用
过滤
"""
res=filter(lambda n:n>5,range(10))

for i in res:
    print(i)
"""
和lambda 结合的还有map
"""
res=map(lambda n:n*n,range(10))

for i in res:
    print(i)

"""
和lambda 结合的还有 reduce
"""
import functools
res=functools.reduce(lambda x,y:x+y,range(10))
print(type(res),res)
"""

frozenset 将集合变成不可更改的
"""
a=set([1,4,33,212,33,33,12,4])
print(a)
a.add(3)
print(a)
a=frozenset(a)

"""
globals 打印出全部的变量
以键值对形式表示
"""
print(globals())

"""
hex 转换成十六进制
"""
print(hex(17))

"""
locals 打印出局部的变量
"""
def abd():
    s=2
    print(locals())
abd()

"""
max()取最大数值
"""
print(max(1,2,3,4,5))
"""
min()取最小数值
"""
print(min(1,23,4,5,6))

"""
oct将数值转换成八进制
"""
print(oct(8))

"""
pow 求数值的多少次方
和 x**y 一样的结果
"""
print(pow(2,10))
print(2**10)

"""
round()
将小数点后取几位
"""
print(round(2.1234,1))

"""
sorted()排序
"""
a={1:2,3:5,11:325,32:5}
print(sorted(a.items(),key=lambda x:x[1]))

"""
zip()
中文意思就是拉链 将两个列表连在一起
"""
a=[1,2,3,4,5,6]
b=[‘a‘,‘b‘,‘c‘,‘d‘]
for i in zip(a,b):
    print(i)

原文地址:https://www.cnblogs.com/Never-give-up-WH/p/8457884.html

时间: 2024-08-13 04:49:03

python第二章函数以及常用模块的相关文章

Head First Python 第二章 函数模块&amp;第三章 文件与异常&amp;第四章 持久存储&amp;第五章 处理数据

第三章 1.共享模块 模块和发布工具箱全世界共享模块 编写函数,以.py为文件后缀名,第三方库都在PyPI *注释代码:三引号(单双都可以) 发布过程P40 使用发布工具,函数模块变成了一个“发布”,可以使用import导入其他程序 2.如果函数模块功能不满意 添加参数以供api选择比添加函数工作量小! 首先考虑BIF内置函数 ----------------------------------------------------------- 第四章 1.文件 open()语句,readlin

学习Python必须要知道的常用模块

在程序设计中,为完成某一功能所需的一段程序或子程序:或指能由编译程序.装配程序等处理的独立程序单位:或指大型软件系统的一部分.本文为你介绍了Python中的两种常用模块. os: 这个模块包含普遍的操作系统功能.利用这个模块可以写出与平台无关的程序,比如就是使用os.sep可以取代操作系统特定的路径分割符. 列举一些os模块中常用的方法: os.name:获取当前系统平台,Windows下返回'nt',Linux下返回'posix'. os.linesep:获取当前平台使用的行终止符.Windo

machine learn in python 第二章2.1.1

1关于 sklearn.datasets from sklearn.datasets import load_iris import numpy as np data = load_iris() data 的属性如下: 数据存储在.data项中 每个观察对象的种类存储在数据集的.target属性中 数据的特征的种类存储在数据集的.feature_names属性中. 2关于遍历问题 a:遍历不取item的序号i for item in sequence: process(item) b: for 

[Head First Python] - 第二章 python of comment

1- 多行注释 ''' ''' 或 """ """ '''this is the standard way to include a multiple-line comment in you code''' """this is the standard way to include a multiple-line comment in you code""" 2- 单行注释 # # t

Python函数和常用模块【day06】:shutil-shelve-xml-configparser模块

本节内容 shutil模块 shelve模块 xml模块 configparser模块 shutil模块 一.简述 我们在日常处理文件时,经常用到os模块,但是有的时候你会发现,像拷贝.删除.打包.压缩等文件操作,在os模块中没有对应的函数去操作,下面我们就来讲讲高级的 文件.文件夹.压缩包 处理模块:shutil 二.模块详解 1.shutil.copyfileobj(fsrc, fdst) 功能:把一个文件的内容拷贝到另外一个文件中,可以是部分文件内容. 1 2 3 with open("f

Python自动化运维之常用模块-re

1.简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行. 2.正则表达式中常用的字符含义2.1 普通字符和11个元字符: 这里需要强调一下反斜杠\的作用: 反斜杠后边跟元字符去除特殊功能:(即将特殊字符转义成普通字符) 反斜杠后边跟普通字符实现特殊功能:(即预定义字符) 引用序号对应的字组所匹配的字符串. >>> import re >

Python学习之路13?常用模块

一 time模块 在Python中,通常有这几种方式来表示时间: 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行"type(time.time())",返回的是float类型. 格式化的时间字符串(Format String) 结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时) 1 import time 2 #

Python基础-第五天-常用模块

本篇内容: 1.sys模块 2.os模块 3.time模块和datetime模块 4.random模块和string模块 5.shutil模块 6.json模块和pickle模块 7.shelve模块 8.hashlib模块和hmac模块 9.logging模块 10.re模块 一.sys模块 1.sys模块简介 sys模块是Python标准库中自带了一个模块,sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境 2.sys模块的使用 ①pyt

python入门(九)常用模块

python的常用模块很多比如日志模块logging调用日志模块 import logging 级别高低顺序: DEBUG < INFO < WARNING < ERROR < CRITICAL默认从warning以后包含warning开始打印如果想打印全面,可以调整默认的模版 import logging logging.basicConfig(level=logging.DEBUG) 可以随意定义也可以自己定义打印的级别,比如输出某个字符串,我定义这个输出为WARNING级别