python笔记-进阶

Python速成笔记——(进阶)处理Excel表格 Python Excel表格处理 阅读详情

目录

目录

参数传递

迭代器/生成器

比较

拷贝

进程VS线程VS协程

并发vs并行

装饰器

函数嵌套

函数装饰器

带参数的装饰器

带自定义参数的装饰器

类装饰器

枚举

上下文管理器

坑



参数传递

Python 中参数的传递既不是值传递,也不是引用传递,而是赋值传递,或者是叫对象的引用传递

赋值或对象的引用传递,不是指向一个具体的内存地址,而是指向一个具体的对象。

  • 如果对象是可变的,当其改变时,所有指向这个对象的变量都会改变。
  • 如果对象不可变,简单的赋值只能改变其中一个变量的值,其余变量则不受影响。

迭代器/生成器

迭代器生成器
说明

实现了__iter__和__next__方法的对象都称为迭代器

迭代协议:

当任何可迭代对象传入到for循环或其他迭代工具中进行遍历时,迭代工具都是先通过iter函数获得与可迭代对象对应的迭代器,然后再对迭代器调用next函数,不断的依次获取元素,并在捕捉到StopIteration异常时确定完成迭代

两种方式:

  • 普通函数使用了 yield 语句返回结果
  • 生成器表达式

对比
  • 迭代器和列表的区别:

列表一次性加载所有元素到内存中,而迭代器是以延迟计算的方式返回元素,等到调用next时才返回元素

  • 所有容器都是可迭代的,例如list、dict、tuple、set等

  • 列表推导式VS生成器表达式:

列表推导式一次性产生所有结果,而生成器表达式等到调用next时才返回元素

  • 生成器是一种特殊的迭代器
特点

  • 迭代器不可回退
  • 文件对象既是迭代器,又是可迭代对象
生成器只能遍历一次
优点
  • 减少内存
  • 提高代码可读性
举例
  • 将可迭代对象--->迭代器:(iter()函数)
L = [2,3,4]
I = iter(L)
  • 读取文件:(一次读一行)
f = open('myfile.txt')
print(next(f))
print(next(f))


-->
hello text file
goodbyt text file
  • 迭代器实现斐波那契数列:
class Fib:
    def __init__(self):
        self.prev = 0
        self.curr = 1

    def __iter__(self):
        return self

    def __next__(self):
        self.curr, self.prev = self.prev + self.curr, self.curr
        return self.curr

fib = Fib()
for i in range(10):
    print(next(fib))

  • 生成器表达式:(使用括号)
g = (x*2 for x in range(10))
  • 生成器实现斐波那契数列:
def fib():
    prev, curr = 0, 1
    while True:
        yield curr
        curr, prev = prev + curr, curr

f = fib()
for i in range(10):
    print(next(f))



 

比较

==is
说明比较对象之间的值是否相等
  • 比较的是对象的身份标识是否相等,即它们是否是同一个对象,是否指向同一个内存地址。
  • 操作符'is'的速度效率,通常要优于'=='
其他出于对性能优化的考虑,Python 内部会对 -5 到 256 的整型维持一个数组,起到一个缓存的作用,所以这部分数据用is比较,结果为true

拷贝

赋值浅拷贝深拷贝
使用b=a
  • 切片操作:b = a[:]
  • 工厂函数:b = list(a)、b =set(a)...
  • copy 模块中的 copy 函数:b=a.copy()
b=copy.deepcopy(a)
说明
  • 对象的赋值即对象引用,他们指向同一片内存,b 不过是 a 的别名,是引用,它们的id是一样的
  • 值和地址都是一样的
  • 浅拷贝会创建新对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用
  • 浅拷贝对于一维列表而言和深拷贝一样,而对于多维列表,修改B的一维内容时A不会变化;而修改高维内容时A也会随之变化
包含对象里面的子对象的拷贝,原始对象的改变不会造成深拷贝里任何子元素的改变
举例

import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象
 
b = a                       #赋值,传对象的引用
c = copy.copy(a)            #对象拷贝,浅拷贝
d = copy.deepcopy(a)        #对象拷贝,深拷贝
 
a.append(5)                 #修改对象a
a[4].append('c')            #修改对象a中的['a', 'b']数组对象
 
print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )


# 输出结果
# ('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
# ('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
# ('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
# ('d = ', [1, 2, 3, 4, ['a', 'b']])

进程VS线程VS协程

说明特点
进程进程是一个实体,是一个具有独立功能的程序在某个数据集上的一次运行活动
  • 动态性:动态产生、动态消亡
  • 独立性:是系统分配资源和调度的基本单元
  • 并发性:可以和其他进程并发执行
线程线程是进程中的一个实体,是被系统独立调度和分派的基本单位
  • 同一进程中的多个线程并发执行,这些线程共享进程所拥有的资源
  • 进程是CPU资源分配的基本单位,线程是独立运行和独立调度的基本单位
  • 一个进程包含若干个线程线程的调度与切换比进程快很多
协程协程是一种比线程更加轻量级的存在,协程不被操作系统内核管理,协程是完全由程序控制的

协程不需要多线程的锁机制,因为只有一个线程,不存在变量冲突

并发vs并行

说明适用场景
并发同一时刻,只有一个线程/任务在执行,线程和任务相互切换进行适用io操作频繁的场景
并行多个进程同时进行适用cpu计算复杂的场景

如果是 I/O bound,并且 I/O 操作很慢,需要很多任务 / 线程协同实现,那么使用 Asyncio 更合适。

如果是 I/O bound,但是 I/O 操作很快,只需要有限数量的任务 / 线程,那么使用多线程就可以了。

如果是 CPU bound,则需要使用多进程来提高程序运行效率。

装饰器

函数嵌套

装饰器可以嵌套使用,执行顺序从里到外


@decorator1
@decorator2
@decorator3
def func():
    ...

执行顺序等价于:
decorator1(decorator2(decorator3(func)))

函数装饰器

带参数的装饰器


def decorator_a(func):
    def wrapper(message):
        print('wrapper of decorator')
        func(message)
    return wrapper


@decorator_a
def greet(message):
    print(message)


greet('hi')

# 输出
wrapper of decorator
hi

带自定义参数的装饰器


def repeat(num):
    def decorator_a(func):
        def wrapper(*args, **kwargs):
            for i in range(num):
                print('wrapper of decorator')
                func(*args, **kwargs)
        return wrapper
    return decorator_a


@repeat(4)
def greet(message):
    print(message)

greet('hello world')

# 输出:
wrapper of decorator
hello world
wrapper of decorator
hello world
wrapper of decorator
hello world
wrapper of decorator
hello world

类装饰器

类装饰器主要依赖于函数__call__(),每当你调用一个类的示例时,函数__call__()就会被执行一次

eg:


class Count:
    def __init__(self, func):
        self.func = func
        self.num_calls = 0

    def __call__(self, *args, **kwargs):
        self.num_calls += 1
        print('num of calls is: {}'.format(self.num_calls))
        return self.func(*args, **kwargs)

@Count
def example():
    print("hello world")

example()

# 输出
num of calls is: 1
hello world

example()

# 输出
num of calls is: 2
hello world

...

函数被装饰以后,它的元信息会改变,为了解决这个问题,我们使用内置的装饰器@functools.wrap,帮助保留原函数的元信息

eg:


import functools

def my_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print('wrapper of decorator')
        func(*args, **kwargs)
    return wrapper
    
@my_decorator
def greet(message):
    print(message)

greet.__name__

# 输出
'greet'

枚举

定义:

from enum import Enum

@unique
class Role(Enum):
    father = 1
    mother = 2
    sister = 3
 

使用:


#调用枚举成员的 3 种方式
print(Role.father)
print(Role['father'])
print(Role(1))

-->
Role.father
Role.father
Role.father


#调取枚举成员中的 value 和 name
print(Role.father.value)
print(Role.father.name)

-->
1
father


#遍历枚举类中所有成员的 2 种方式
for role in Role:
    print(Role)

-->
Role.father
Role.mother
Role.sister

注意事项:

  • 枚举类中各个成员的值,不能在类的外部做任何修改
  • Python 枚举类中各个成员必须保证 name 互不相同,但 value 可以相同
  • 借助 @unique 装饰器,这样当枚举类中出现相同值的成员时,程序会报 ValueError 错误

上下文管理器

作用:防止资源泄露,释放系统资源,提高系统安全性

使用场景:文件的打开关闭、数据库的连接关闭、使用释放锁

用法:with 语句(有了with语句,就不用写关闭代码了)

打开文件

with open('test.txt', 'w') as f: 
    f.write('hello')

等同于


f = open('test.txt', 'w')
try:
    f.write('hello')
finally:
    f.close()

实现:

        基于类的上下文管理器:

用类来创建上下文管理器时,必须保证这个类包括方法”__enter__()”和方法“__exit__()”。其中,方法“__enter__()”返回需要被管理的资源,方法“__exit__()”里通常会存在一些释放、清理资源的操作


class FileManager:
    def __init__(self, name, mode):
        print('calling __init__ method')
        self.name = name
        self.mode = mode 
        self.file = None
        
    def __enter__(self):
        print('calling __enter__ method')
        self.file = open(self.name, self.mode)
        return self.file


    def __exit__(self, exc_type, exc_val, exc_tb):
        print('calling __exit__ method')
        if self.file:
            self.file.close()
            
with FileManager('test.txt', 'w') as f:
    print('ready to write to file')
    f.write('hello world')
    
## 输出
calling __init__ method
calling __enter__ method
ready to write to file
calling __exit__ method

        基于生成器的上下文管理器:

使用基于生成器的上下文管理器时,我们不再用定义“__enter__()”和“__exit__()”方法,但请务必加上装饰器 @contextmanager


from contextlib import contextmanager

@contextmanager
def file_manager(name, mode):
    try:
        f = open(name, mode)
        yield f
    finally:
        f.close()
        
with file_manager('test.txt', 'w') as f:
    f.write('hello world')

坑

1、pipfile中引包,*表示任意版本的包,为防止兼容性问题,最好指定包版本,不用通配符

2、若pipfile文件中指定安装某插件报错,可尝试在jenkinsfile中强制安装

参考:https://blog.youkuaiyun.com/sinat_38682860/article/details/108681726?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-4.control

Python 进阶学习笔记 Python 进阶学习笔记 当年学了点Python2 ,那时候听说什么Python3 失去了Python的灵魂,就没管Python3 。 最近因为项目需要使用Python3,又把当年的那份热血花在了Python3的学习上。 本以为Python3只是Python2 的升级会很好上手,没想到Python3相对于Python2而言有太多的新语法、新概念。 从小养成学习记笔记的好习惯,把学习遇到的重点写下来,第一日后复习用,其次如果有其他同学看到我的笔记,并感觉有用,也是算是我劳动成果的附加收益吧 文章目录函数式编 阅读详情

相关推荐

雷电模拟器安装面具环境并过软件检测系列(看这一篇就够了!)

雷电模拟器安装面具环境并过基本软件的环境检测

qq_45059975的博客 6万+

python中的上下文管理器_Python中的上下文管理器

操作文件对象时可以:with open('a.txt') as f:'代码块'上述叫做上下文管理协议,即with语句。想象一下,你有两个需要结对执行的相关操作,然后,还要在他们中间放置一段代码。比如打开一个文件,操作文件,然后关闭该文件。打开文件和关闭文件就是一个结对的操作。上下文管理器的常见用例:是资源的加锁与解锁,文件的打开与关闭。上下文管理器上下文管理器协议:是指类需要实现 __ enter...

weixin_39816448的博客 185

Robosuite与Robomimic:机器人学习的黄金搭档

本文深入探讨了Robosuite与Robomimic这对机器人学习的黄金组合,详细介绍了如何利用Robosuite进行物理仿真和任务环境构建,以及Robomimic在演示数据处理和离线学习算法实现中的应用。通过实际案例和代码示例,展示了从仿真环境搭建到模型训练的全流程,帮助研究人员高效开展机器人学习实验。

weixin_29178069的博客 416

Python3中上下文管理器介绍

在任何编程语言中,文件操作或数据库连接等资源的使用都很常见。但这些资源供应有限。因此,主要问题在于确保在使用后释放这些资源。如果不释放它们,则会导致资源泄漏,并可能导致系统变慢或崩溃。如果用户有一个自动设置和拆卸资源的机制,这将是非常有帮助的。在Python3中,可以通过使用上下文管理器(context manager)来实现,这有助于正确处理资源。上下文管理器是一个对象。 在Python3中,可以通过上下文管理器来管理资源。可通过三种方式创建上下文管理器:基于类的上下文管理器、基...

网络资源是无限的 1086

东华大学oj系统 39 最大乘积

39 最大乘积 作者: Turbo时间限制: 1S章节: 深度优先搜索 问题描述 : 对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢? 输入说明 : 第一行一个数表示数据组数   每组输入数据共2行:   第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,   第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。 输出说明 : 每组数据输出1行,为最大的乘积。 输入范例 : 1 5 5 1 2 3 4 2 输出范例 : 48 注:难

weixin_50336369的博客 528

三极管和MOS管工作原理详解

PN结的形成 PN结是三极管以及场效应管中最基本的组成部分,要想彻底搞明白三极管以及场效应管的工作原理,必须先搞清楚PN结形成的原理和工作特性。 本征半导体以及空穴对 本征半导体(intrinsic semiconductor))完全不含杂质且无晶格缺陷的纯净半导体称为本征半导体。主要常见代表有硅、锗这两种元素的单晶体结构。硅、锗都是4价原子,在半导体内部形成相对稳定的共价键结构,如图 1所

技术交流是便宜的的博客 10万+

Python基础(十)-面向对象三

一、isinstance(obj,cls)和issubclass(sub,super)1.1、isinstance(obj,cls) isinstance(obj,cls)检查是否obj是否是类 cls 的对象class Foo(object): pass obj = Foo() print(isinstance(obj,Foo)) #True 1.2、issubclass...

bangmozuan5680的博客 257

YOLOv8融合HAttention:激活更多像素的注意力机制科研实践指南

HAttention通过层级化像素激活与融合的设计,为YOLOv8的像素级特征利用能力带来了质的飞跃。从原理理解到代码实现,再到集成调优,每一步都是科研中“解决像素信息遗漏难题”的具体实践。如果你在实验中发现某类细节或大尺度目标的检测仍有不足,可以尝试结合数据增强(如随机裁剪、多尺度训练)来强化模型对像素特征的学习能力。科研的价值在于不断挖掘技术的潜力,希望这份指南能真正帮你在目标检测的像素级特征利用领域找到新的突破点,祝你在科研探索中持续收获创新与成长。

FJN110的博客 106

Python基础语法:迭代器 Iterator、itertools

1. 自定义迭代器 迭代器可以通过next()函数获取下一个值,也可以通过for循环。字符串,列表或元组对象都可通过iter()函数创建迭代器。也可以自定义迭代器。 list = [1, 2, 3] it = iter(list) print(next(it)) for i in it: print(f"list[i]={i}") """ 自定义迭代器 __iter__(self): ...

人不风流枉少年 1257

3.PCIe协议分析1-预备知识点

PCIE协议分析1主要讲一下四方面: PCI-E配置空间 PCI-E地址映射 PCI-E Bar空间 PCI-E层级结构详谈 (1)PCIE配置空间 我们过来学习PCIE的同学应该都接触各种类型的功能芯片吧,这些功能芯片连接在电路里面我们可以认为它是一个外部设备,这些设备里面有自己独有的寄存器区域,比如SDRAM里面的ID寄存器或者其他配置寄存器。好的,其实我们PCIE板卡也相当...

一个早起的程序员 4145

【20260309】【亲测可用】【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled

【异常】Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection。

奶爸的编程之路,也就一周冷个三天 2万+

【Python入门】16.面向对象编程之 装饰器@preperty 和 枚举类Enum

本学习笔记基于廖雪峰的Python教程,更新于2019年11月29日。欢迎与博主一起学习Pythonヽ( ̄▽ ̄)ノ 本节内容包括:@preperty可以把方法变成属性调用;使用Enum类定义枚举类

三贝 683

C#企业级工作流管理:从优化到重构的实战指南——代码深度解析与性能调优策略

本文通过Workflow Core与Elsa引擎实现企业审批流程优化,将处理时间从72小时缩短至2小时,效率提升200%。文章包含12个代码示例,涵盖流程梳理、引擎选型(对比Workflow Core与Elsa特性)、模块化重构(策略模式应用)及异常处理机制。关键实现包括:可视化流程建模、Serilog性能监控、Elsa集成配置、策略模式消除重复代码,以及补偿事务设计。最终方案支持高并发,通过数据库连接池优化性能,为企业级工作流系统提供完整技术方案。

墨夶的博客 896

进阶Python 笔记

ch1 课程介绍 ch2 函数式编程 2.1 函数式编程 函数式:functional 一种编程范式 2.2 py中高阶函数 2.3 python把函数作为参数 import math def add(x, y, f): return f(x) + f(y) print add(25, 9, math.sqrt) 8 2.4 map()函数 map...

sinat_38368658的博客 298

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

python进阶课程_Python进阶课程笔记(一)

原标题:Python进阶课程笔记(一)这周听了三节Python进阶课程,有十几年的老程序给你讲课传授一门语言的进阶知识,也许这是在大公司才能享受到的福利。虽然接触使用Python也有三四年时间了,但是从课程中还是学习到不少东西,掌握了新技巧的用法,明白了老知识背后的原因。下载了课件,做了笔记,但我还是希望用讲述的方式把它们表现出来,为未来的自己,也给需要的读者。整体以大雄的课程为蓝本,结合我在开发...

weixin_39826809的博客 296

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Python笔记(十) -- 进阶语法

占坑待写

huangpg丶计算机视觉算法工程师之路 218

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

《Python进阶》学习笔记之Golang

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33725239的博客 74

python课程笔记_Python进阶课程笔记(六)

原标题:Python进阶课程笔记(六)在讨论完Callable相关的部分之后,我们继续来看一下Class相关的两个东西——Property和super。9. Property这部分其实比较简单,属于Python的基本内容,也是工作中经常用到,比如做属性封装,在属性访问的时候添加一些自己想要做的事情。直接看一个简单的代码例子。class A(object): def __init__(self, a...

weixin_32015301的博客 125

python进阶之学习笔记_【原】Python学习笔记——进阶篇

python的高阶函数一个函数作为另外一个函数的参数、map()、reduce()、filter()、自定义排序函数、一个函数返回另外一个函数作为返回值闭包匿名函数装饰器 类似于java的aop1.利用Python的 *args 和 **kw,保证任意个数的参数总是能正常调用2.如果要让调用者看不出一个函数经过了@decorator的“改造”,就需要把原函数的一些属性复制到新函数中,Python内...

weixin_34450092的博客 221

python进阶-自学笔记

面向对象+文件操作+模块与包

m0_73256254的博客 2089

【python进阶 笔记】正则表达式

【python高级基础 笔记】正则表达式 目录 1.re模块 2.匹配单个字符 3.匹配多个字符 4.匹配开头结尾 4.1. 实例判断变量名是否符合要求 4.2实例 匹配邮箱地址 5.匹配分组 5.1.|实例:匹配出0-100之间的数字。 5.2. ( )实例: 5.3.\实例 5.4.(?P)(?P=name)实例 6. re高级...

在下能猫 的博客 634

Python进阶笔记

函数式编程 面向对象 变量 方法(存储在内存中) 属性(@property def func(self)) 创建类的两种方法 使用枚举类(枚举类不可比较大小,但是同一枚举类的成员可以做等值is / not is判断) 定义枚举类 高级面向对象 元类types 元类type构造对象 使用Slot限制添加属性 装饰器 python垃圾回收机制 python 异常(Exception)、调试(Debug)、回溯(Traceback) 异常(Exception) 调试(Debug) 回溯(Trace.

Cybenko 682

学习笔记11 Python之进阶

电脑已经安装好anaconda,最近先用anaconda,后面再学习jupyter。 学习教材《python数据分析基础》 时间的代码 from math import exp,log,sqrt import re from datetime import date,time,datetime,timedelta today=date.today() print("Output #41:today:{0!s}".format(today)) print("Output #42:today:{0!s}".f

m0_46497494的博客 166

python进阶之学习笔记_Python进阶学习笔记

第1章课程介绍Python入门中我们学习了:如何安装Python环境变量和数据类型:Python内置的基本类型List列表和Tuple元组:顺序的集合类型条件判断和循环:控制程序流程函数:定义和调用函数切片:如何对list进行切片迭代:如何用for循环迭代集合类型列表生成式:如何快速生成列表Python进阶课程我们讲要学习:函数式编程:不是函数编程哦,是函数式编程模块:如何使用模块面向对象编程:面...

weixin_28787725的博客 294

Python 进阶学习笔记之四:高效迭代器工具

Python 内置数学模块 Math 和 快捷迭代器工具模块 itertools

zombres的博客 479

Python 进阶学习笔记之九:IO 编程

IO 操作是所有高级编程语言中的重点,本文章详细介绍来 Python 中关于常见 IO 操作的相关接口,包括基本的文件读写、StringIO/BytesIO、目录操作等

zombres的博客 485
上一篇: kafka笔记
下一篇: uml时序图笔记
sssammmm
博客等级 码龄9年 369粉丝 42原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值