详谈Python之高级特性

Python 高级特性与技巧大揭秘 Python 允许开发者定义自己的异常类型。通过继承内置的Exception类,我们可以创建具有自定义行为的异常类。")try:print(e) # 输出: This is a custom error!Python 是一门功能强大的编程语言,提供了丰富的高级特性和技巧。通过深入理解并熟练应用这些特性,开发者可以编写更加高效、简洁且易于维护的代码。在日常开发中,我们可以结合函数式编程、面向对象编程、上下文管理、生成器等技术,优化我们的代码结构,提高开发效率。 阅读详情

什么是Python的高级特性?

这个问题对于许多正在学习Python的小伙伴来说可能会很疑惑?很多人知道这个名词,但不知道这玩意到底是什么。其实,Python作为一门高级语言它有许多的内置函数,运用这些函数可以很方便的完成一些功能,而这些特性,笼统的可称为Python的高级特性。简单地说Python的高级特性就是一些Python函数的高级用法。

1.语言特性

(1)python是动态强类型的语言

动态还是静态指的是编译器还是运行期确定类型。

强类型指的是不会发生隐式类型转换。比如js能够执行1+“1”,但是python不行,所以python是弱类型的语言。

(2)鸭子类型

当一只鸟走起来像鸭子、游泳起来像鸭子、叫气力啊也像鸭子,那么这只鸟就可以被称为鸭子。
鸭子类型关注的是对象的行为,而不是类型。比如file,StringIO,socket对象都支持read/write方法,再比如定义了__iter__魔术方法的对象可以用for迭代。

(3)monkey patch

所谓的monkey patch就是运行时替换。

(4) 自省

运行时判断一个对象类型的能力。

python一切皆对象,用type, id, isinstance获取对象类型信息。

自省,也可以说是反射,自省在计算机编程中通常指这种能力:检查某些事物以确定它是什么、它知道什么以及它能做什么。

与其相关的主要方法:

  • hasattr(object, name)检查对象是否具体 name 属性。返回 bool;
  • getattr(object, name, default)获取对象的name属性;
  • setattr(object, name, default)给对象设置name属性;
  • delattr(object, name)给对象删除name属性;
  • dir([object])获取对象大部分的属性;
  • isinstance(name, object)检查name是不是object对象;
  • type(object)查看对象的类型;
  • callable(object)判断对象是否是可调用对象;
(5)列表和字典推导

如 [i for i in range(10) if i % 2 == 0],如果[]改为(),则为生成器。

(6)变量查找顺序

函数作用域的LEGB顺序

L:local 函数内部作用域 E: enclosing 函数内部与内嵌函数之间 G: global 全局作用域 B:build-in 内置作用。

python在函数里面的查找分为4种,称之为LEGB,也正是按照这是顺序来查找的。

2.Python是如何进行内存管理的

从三个方面来说,一是对象的引用计数机制,二是垃圾回收机制,三是内存池机制。

(1) 对象的引用计数机制

Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。

引用计数增加的情况:

一个对象分配一个新名称;
将其放入一个容器中(如列表、元组或字典);
引用计数减少的情况:

使用del语句对对象别名显示的销毁;
引用超出作用域或被重新赋值;
sys.getrefcount()函数可以获得对象的当前引用计数。

多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。

(2) 垃圾回收

当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
当两个对象a和b相互引用时,del 语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。

(3)内存池机制

Python 提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

3.函数

(1)python如何传递参数

python既不是值传递也不是引用传递,唯一支持的参数传递是共享传参。

call by object(call by object reference or call by sharing)call by sharing(共享传参),函数形参获得实参中各个引用的副本。

变量一切都是对象。list是可变对象,string是不可变对象。

总结一下:根据对象的引用来传递,根据对象是可变对象还是不可变对象,得到两种不同的结果。如果是可变对象,则直接修改。如果是不可变对象,则生产新对象,让形参指向新对象

(2)python可变/不可变对象

不可变对象: bool/int/float/tuple/str/frozenset。

可变对象:list/set/dict。

案例:

# 1
def clear_list(l):
    l = []
ll = [1,2,3]
clear_list(ll)
print(ll)
# 2
def fl(l=[1]):
    l.append(1)
    print(l)
fl()
fl()

# 记住:默认参数只计算一次
(3)*args, **kwargs

用来处理可变参数,args被打包成tuple,kwargs被打包成dict。

传递方式有两种:

# 第一种
foo(1,2,3)
foo(a=1,b=2)
 
# 第二种
foo(*[1,2,3])
foo(**dict(a=1,b=2)})

其实并不是必须写成args和**kwargs。只有变量前面的(星号)才是必须的.你也可以写成var和**vars.而写成args和**kwargs只是一个通俗的命名约定,那就让我们先看一下*args吧。

*args和**kwargs主要用于函数定义。你可以将不定数量的参数传递给一个函数。

这里的不定的意思是:预先并不知道,函数使用者会传递多少个参数给你,所以在这个场景下使用这两个关键字。*args是用来发送一个非键值对的可变数量的参数列表给一个函数。

这里有个例子帮你理解这个概念:

def test_var_args(f_arg, *argv):
    print("first normal arg:", f_arg)
    for arg in argv:
        print("another arg through *argv:", arg)
 
test_var_args('yasoob', 'python', 'eggs', 'test')
这会产生如下输出:

first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test

那接下来让我们谈谈 **kwargs,kwargs允许你将不定长度的键值对,作为参数传递给一个函数。如果你想要在一个函数里处理带名字的参数,你应该使用kwargs。

这里有个让你上手的例子:

def greet_me(**kwargs):
    for key, value in kwargs.items():
        print("{0} == {1}".format(key, value))
 
>>> greet_me(name="yasoob")
name == yasoob

现在你可以看出我们怎样在一个函数里,处理了一个键值对参数了。

这就是kwargs的基础,而且你可以看出它有多么管用。接下来让我们谈谈,你怎样使用*args和kwargs来调用一个参数为列表或者字典的函数。

那现在我们将看到怎样使用*args和**kwargs来调用一个函数。假设,你有这样一个小函数:

def test_args_kwargs(arg1, arg2, arg3):
    print("arg1:", arg1)
    print("arg2:", arg2)
    print("arg3:", arg3)

你可以使用*args或**kwargs来给这个小函数传递参数。

下面是怎样做:

## 首先使用 *args
>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5
 
## 现在使用 **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3
标准参数与*args、**kwargs在使用时的顺序?

4.闭包

闭包特性:

  • 绑定了外部作用域的变量的函数;

  • 即使程序离开外部作用域,如果闭包仍然可见,绑定变量不会销毁;

  • 每次运行外部函数都会重新创建闭包;

  • 闭包:引用了外部自由变量的函数;

  • 自由变量:不在当前函数定义的变量;

  • 特性:自由变量会和闭包函数同时存在;

from functools import wraps
 
def cache(func):
    store = {}
    @wraps(func)
    def _(n):
        if n in store:
            return store[n]
        else:
            res = func(n)
            store[n] = res
            return res
    return _
 
@cache
def f(n):
    if n <= 1:
        return 1
    return f(n-1) + f(n-2)

为什么用@wraps(func)?

因为当使用装饰器装饰一个函数时,函数本身就已经是一个新的函数;即函数名称或属性产生了变化。所以在python的functools模块中提供了wraps装饰函数来确保原函数在使用装饰器时不改变自身的函数名及应有属性。 所以在装饰器的编写中建议加入wraps确保被装饰的函数不会因装饰器带来异常情况。

在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包。

简单的说,如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。

来看一个简单的例子:

>>>def addx(x):
>>>    def adder(y): return x + y
>>>    return adder
>>> c =  addx(8)
>>> type(c)
<type 'function'>
>>> c.__name__
'adder'
>>> c(10)
18

5.面向对象编程

1. 封装、继承、多态
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def print_name(self):
        print self.name
2. 组合与继承

优先使用组合(has a)而非继承(is a)。

3. 类变量和实例变量的区别

类变量由所有实例共享;
实例变量由实例单独享有,不同实例之间不影响;
当我们需要在一个类的不同实例之间共享变量的时候使用类变量;

4. classmethod/staticmethod区别

都可以通过Class.method()的方式使用;
classmethod第一个参数是cls,可以引用类变量;
staticmethod使用起来和普通函数一样,只不过放在类里去组织;

class Person(object):
    Country = 'china'
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def print_name(self):
        print self.name
 
    @classmethod
    def print_country(cls):
        print(cls.Country)
 
    @staticmethod
    def join_name(first_name, last_name):
        return last_name + first_name
5. 什么是元类

元类是创建类的类:

元类允许我们控制类的生成,比如修改类的属性等;
使用type来定义元类;
元类最常见的一个使用场景就是ORM框架;
__new__用来生成实例,__init__用来初始化实例;
例子:

# 元类继承自type
class LowercaseMeta(type):
    """ 修改类的书写名称为小写的元类"""
    def __new__(mcs, name, bases, attrs):
        lower_attrs = {}
        for k, v in attrs.items():
            if not k.startswith('__'):
                lower_attrs[k.lower()] = v
            else:
                lower_attr[k] =v
        return type.__new__(mcs, name, bases, lower_attrs)
 
class LowercaseClass(metaclass=LowercaseMeta):
    BAR = True
 
    def Hello(self):
        print('hello')
 
print(dir(LowercaseClass))
 
LowercaseClass().hello()

python中类方法、类实例方法、静态方法有何区别?

类方法: 是类对象的方法,在定义时需要在上方使用 @classmethod 进行装饰,形参为cls,表示类对象,类对象和实例对象都可调用
类实例方法: 是类实例化对象的方法,只有实例对象可以调用,形参为self,指代对象本身;
静态方法: 是一个任意函数,在其上方使用 @staticmethod 进行装饰,可以用对象直接调用,静态方法实际上跟该类没有太大关系

6. python函数重载机制

函数重载主要是为了解决两个问题。 1。可变参数类型。 2。可变参数个数。

另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数。

好吧,那么对于情况 1 ,函数功能相同,但是参数类型不同,python 如何处理?答案是根本不需要处理,因为 python 可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数。

那么对于情况 2 ,函数功能相同,但参数个数不同,python 如何处理?大家知道,答案就是缺省参数。对那些缺少的参数设定为缺省参数即可解决问题。因为你假设函数功能相同,那么那些缺少的参数终归是需要用的。 好了,鉴于情况 1 跟 情况 2 都有了解决方案,python 自然就不需要函数重载了。

好啦,今天先分享到这,我们下集继续!

Python的高级特性 而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?generator是非常强大的工具,在Python中,可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。这种数据类型虽然有下标,但很多其他数据类型是没有下标的,但是,只要是可迭代对象,无论有无下标,都可以迭代,比如。 阅读详情

相关推荐

麒麟V10等保三级配置实战:从auditd规则到PAM锁定的可信基线构建

Linux安全基线是信息系统可信运行的基础能力,其核心在于身份鉴别、访问控制与安全审计三大机制的协同落地。在国产化信创环境中,麒麟V10作为深度适配飞腾/鲲鹏平台的操作系统,其等保三级合规并非简单套用CentOS加固脚本,而是需围绕内核审计(auditd)、可插拔认证模块(PAM)及国产安全增强机制(如kysec)进行精细化编排。技术价值体现在将抽象条款(如GB/T 22239-2019中6.1.2、6.3.3条)转化为可验证的命令行操作,确保登录失败可锁定、关键行为可追溯、时间偏差不致日志失效。典型应用场

weixin_29969209的博客 596

Python中常见的10个高级特性解析

Python中的装饰器是一种特殊的函数,它可以用来修改其他函数的行为。装饰器可以在不修改原函数代码的情况下,为函数添加额外的功能。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数。在Python中,装饰器使用@符号来表示,可以将其放在函数定义的上方。

qq_28245087的博客 4256

ABB机器人与西门子PLC、工业相机联合实现无序抓取的完整调试方案

将此方案导入系统后,逐步执行调试,确保各环节信号正常触发,即可实现高效无序抓取!

CHUXUEZHE8210的博客 1993

Python 高级特性汇总

点击名片关注阿尘blog,一起学习,一起成长本文主要分享一些Python高级特性如:迭代器、生成器、装饰器、元类、闭包等等1 装饰器装饰器(Decorator)定义:装饰器是一个接受函数作为参数的高阶函数,并返回一个新的函数对象。它主要用于修改或增强原始函数的行为,而不需要修改其源代码。装饰器在Python中是通过@符号来应用的。作用:修改函数行为:装饰器可以在不修改原始函数代码的情况下,增加额...

m0_72418211的博客 1454

YOLOv5模型转换陷阱:从PT到RKNN的置信度异常与乱框问题深度解析

本文深度解析了YOLOv5模型从PT到RKNN转换过程中的置信度异常与检测框错乱问题,揭示了NPU硬件特性与模型结构不匹配的根本原因。通过详细的解决方案和实操步骤,包括模型修改、转换流程配置和验证技巧,帮助开发者有效解决这一常见部署难题,提升模型在瑞芯微芯片上的推理性能。

weixin_29062255的博客 904

[漏洞利用]利用五次Shift越权破解win7\win10开机密码

注:第一个学习和接触的Windows漏洞 文章目录本机实验环境前置知识漏洞原理漏洞介绍漏洞验证解决方法基本流程介绍详细步骤截图 本机实验环境 虚拟机:VMware Workstation 14 pro 操作系统:Windows10 前置知识 1、cmd工具路径 c:\windows\system32\cmd,按五次shift默认调用同目录下sethc文件,其路径为“c:\windows\system32\sethc.exe” 2、用户/账户密码存储位置 c:\windows\system32\config\

Y4tacker的博客 2万+

5 个Python高级特性,让你成为Python高手

5 个Python高级特性,让你成为Python高手

xiqng17111342931的博客 821

2022年8月27日全国青少年信息素养大赛Python编程小学组决赛真题+答案解析

2022年8月27日全国青少年信息素养大赛Python编程小学组决赛真题+答案解析

伶俐角少儿编程 454

Python从入门到进阶:必须掌握的10大高级特性

通过掌握这10大高级特性,你将能够更深入地理解Python的精髓,并编写出更高效、更优雅的代码。无论是处理大数据集、实现并发编程,还是优化程序性能,这些特性都将为你提供强大的支持。希望本文能够帮助你在Python进阶之路上迈出坚实的一步!

shejizuopin的博客 548

第4章-07-将WebDriver获取的Cookie传递给Requests

在使用Selenium WebDriver获取了浏览器的Cookies之后,你可以将这些Cookies传递给requests库,以便在后续的HTTP请求中使用这些Cookies。这样做可以让你模拟浏览器会话,使得请求看起来像是从之前使用Selenium WebDriver控制的浏览器发出的。

黑夜开发者的博客 692

把 ABAP 接到外部世界的几条路, 从 Web Service 到 RFC、BAPI 与 IDoc 的完整理解

摘要: ABAP 的连接能力是其长期成为企业核心的关键,不仅支持通用协议(HTTP、SOAP、XML),还保留了 SAP 特有的技术(RFC、BAPI、IDoc)。Web Service 是跨系统通信的主轴,依赖 SOAP/WSDL 实现契约化协作,而 Enterprise Service 更强调业务语义的复用与治理。经典技术如 RFC 和 BAPI 因高效稳定仍广泛使用,尤其适合紧耦合场景。ABAP 通过分层工具箱(如代理生成、服务注册)实现灵活集成,平衡新旧技术,满足多样化的企业连接需求。 (字数:15

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 138

详谈Python的高级特性、函数式编程、高阶函数

1、什么是Python的高级特性? 这个问题对于许多正在学习Python的小伙伴来说可能会很疑惑?很多人知道这个名词,但不知道这玩意到底是什么。其实,Python作为一门高级语言它有许多的内置函数,运用这些函数可以很方便的完成一些功能,而这些特性,笼统的可称为Python的高级特性。简单地说Python的高级特性就是一些Python函数的高级用法。 (1)集合的推导式 列表推导式,使用一...

流夏_ 422

大模型之Spring AI实战系列(二):Spring Boot + OpenAI 打造聊天应用全攻略

本篇文章是《Spring AI实战》专栏的第一篇开发入门文章,我们将借助一个完整的OpenAI聊天应用示例,详细介绍如何运用Spring Boot和Spring AI快速搭建一个支持OpenAI API的聊天服务,全面涵盖基础对话、流式对话、多提供商配置等核心功能。

寻道AI,探索AI无限可能! 6867

Python高级特性

我一直认为Python是一门很神奇的语言。神奇之处在于其既可阳春白雪,亦可下里巴人。也就是其简单到几乎所有的人稍加学习即可上手,但是你如果细细品味,就会发现他还有很多高深的东西。正如一位漂亮的姑娘,一眼看上去就会喜欢上。交往深入,你会发现她精通琴棋书画而且非常有内涵,我相信你这时肯定会深深的迷恋上她。 这篇文字的目的就是想整理一些Python的高级特性,试图为大家揭开Python的神秘面

张知临的专栏 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

python高级特性_Python高级特性

参考原文开篇:高级特性是用来简化我们常用操作的特性,合理利用高级特性可以使代码更简洁、明了。切片取list或tuple中的指定索引范围的操作,用循环十分繁琐,因此Python提供了切片(Slice)操作符,能大大简化这种操作。示例:>>> L = ['a', 'b', 'c', 'd']>>> L[0:3]['a', 'b', 'c']L[0:3]表示从索引0开始取,直到索引3为止,但不包括索引3...

weixin_39614874的博客 106

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python(高级特性、高级函数、)

我们都知道,电脑的容量是有限的,list是不能无限大的。有什么区别呢,最主要的区别是,容量。会发现,python的for循环会更加抽象,比如说,最常见的是list和tuple,他们是有下表的,但是python也可以遍历没有下标的。这个类似于f=log(f),我们知道,log函数返回的是一个函数,f是个变量指向了wrapper函数。text参数传入,decoretor函数返回一个decorator函数,接下来和上面的操作一样的。按照我们常规的思维来说,i,传入会立即返回一个值,但是,闭包不会。

lindaiyuvaryhapp的博客 1504

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Python 高级特性

Python 高级特性 文章目录Python 高级特性切片迭代列表生成式生成器 generator迭代器 切片 可以对list, tuple, string进行切片 [起始位置:终止位置 + 1: 步长] 可以使用负数,-1为倒数第一个数 步长为负数时,从后向前分隔,对应的起始终止位置也要倒过来 l = [1, 2, 3] l = l[::-1] #顺序反转 #3, 2, 1 迭代 默认情况下,...

weixin_43763903的博客 389

python高级特性

这便是L = [‘张三’,‘李四’,‘王五’,‘赵六’]的切片操作,我们知道list可以从下标取出对应元素,,L[0:3]就是取出,下标为0,1,2的元素,即不包括3.第二行说明为0时可省略。list[-1]是list中的最后一个元素,这里也可以使用,L[-2:]就是倒数第二个元素到最后一个元素,L[-2:-1]则又是最后一个元素前,故不包含’赵六’。我们先看前两行,最基础的,我们构建一个新list,从L中取出元素放进去。修改前面的x*x,我们可以生成之前的[1,3,5,7,9]

2301_76278775的博客 872

Python 语法糖解析与高级特性

Python 的语法糖和高级特性极大地提升了开发效率和代码质量。通过合理运用这些特性,开发者可以编写出更加简洁、优雅且易于维护的代码。希望本文能帮助你更好地理解和利用 Python 的这些强大功能。```

2501_91228027的博客 1116

【Python】高级特性

就普通函数而言,当程序运行到return时,会把后面的表达式返回并结束函数同时删除局部变量,但yield的作用是暂停函数,同时保留局部变量,在下一次调用生成器函数时继续运行,因而可以理解为该函数返回的是一个可迭代的数据流。在Python当中,允许函数嵌套,即在函数当中定义一个函数,这个内部函数是属于外部函数的,只能在外部函数内部调用。对于这种函数,当你给外部函数传递参数后,可以理解为函数会完成部分初始话,同时返回里面的函数,当所有内嵌函数都传递完参数后,函数才会返回程序运行的结果。

weixin_58052073的博客 1014
上一篇: 详谈Python的核心概念
下一篇: 我通过Python做副业每个月收入30000+,这绝对是2023最赚钱的副业!
python_One1
博客等级 码龄4年 52粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值