repr(reprise)

软件问答 2023.01.22 158

目录:

python当中的eval()函数是起什么作用?

python当中的eval()函数是将字符串当成有效Python表达式来求值,并返回计算结果

x = 1

eval('x+1')

eval('x==1')

与之对应的repr函数,它能够将Python的变量和表达式转换为字符串表示:

repr(x+1)

repr(x+ ‘1’-1)('x=+=1')

Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议。Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。

Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。

常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。

需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。

Python中,已知一个对象的repr的值,怎么能反向推出那个对象?

Python的特色简单 Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。 易学 就如同你即将看到的一样,Python极其容易上手。前面已经提到了,Python有极其简单的语法。 免费、开源 Python是FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。这是为什么Python如此优秀的原因之一——它是由一群希望看到一个更加优秀的Python的人创造并经常改进着的。 高层语言 当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。 可移植性 由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就可以在下述任何平台上面运行。 这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC! 解释性 这一点需要一些解释。 一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。 而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码 运行 程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用Python更加简单。由于你只需要把你的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。 面向对象 Python即支持面向过程的编程也支持面向对象的编程。在 面向过程 的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在 面向对象 的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。 可扩展性 如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。 可嵌入性 你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。 丰富的库 Python标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。 除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。

流畅的Python

第一章 Python数据模型

魔术方法(magic method)或者说双下方法(dunder method)表示特殊方法。以双下划线开始和结束,比如 getitem

len()需要实现 len ()

[]和切片需要实现 getitem ()

可迭代或者反向迭代,至少需要实现 getitem ()

in需要实现 contains (),如果没有实现,则至少需要实现 getitem (),因为它可以自己做迭代搜索

repr,它能把一个对象有字符串的形式表达出来,repr就是通过 repr 这个特殊方法来得到一个字符串的表达形式的。如果没有实现 repr ,输出实例时,得到的字符串就是Vector object at 0x10e100070之类的

注意 repr 和 str 的区别,后者是在str()函数中使用,或者是在用print函数打印的时候才被调用。

如果一个对象没有 str 函数,而Python又需要调用它的时候,解释器会用 repr 作为替代。

在if,while或者and or not运算符中,为了判定一个值x是真还是假,Python会调用bool(x),这个函数只能返回True或者False。

bool(x),其实调用的是x. bool ()的结果,如果不存在 bool ,bool(x)会尝试调用x. len ().若返回0,则bool会返回False,否则True。

第二章 序列构成的数组

序列类型概览

1、容器序列

list、tuple、collections.deque这些序列都能存放不同类型的数据

2、扁平序列

str、bytes、bytearray、memoryview和array.array,这些序列只能容纳一种类型。

注意:容器序列存放的是它们所包含任意类型的对象的引用,二扁平序列里存放的是值而不是引用。换句话说,扁平序列其实是一系列连续的内存空间,但是扁平序列只能存放字符、字节和数值这种基础类型。

可变序列

list、bytearray、array.array、collections.deque和memoryview

不可变序列

tuple、str和bytes

列表推倒

symbols = 'abc'

codes = []

for symbol in symbols:

codes.append(symbol)

codes = [symbol for symbol in symbols]

第一种就是正常的for循环,第二种就是列表推导

生成器表达式

虽然可以用列表推导来初始化元组、数组或者其他序列类型,但是生成器表达式更好。因为生成器表达式背后遵循了迭代器协议,可以逐个产出元素,而不是先建立一个完整的列表,然后再把这个列表传递到某个构造函数里面。

和列表推导差不多,就是方括号改成圆括号

symbols = 'abc'

array.array('i', (symbol for symbol in symbols))

元组的应用:

1、当作记录,因为它是不可更改的

2、元组拆包,可以得到里面的数据 类似于 a, b = (first, second)

3、具名元组,从collections.namedtuple生成具名元组,除了继承普通元组的属性,具名元组还有一些自己专有的属性。_fields类属性,类方法_make(iterable)和实例方法_asdict()。

_fields类属性:包含具名元组的各个字段名称

_make(iterable):通过_make()接受一个可迭代对象来生成这个类的一个实例

_asdict():把具名元组以collections.ordereddict的形式返回。

切片:

s[a:b:c] s在a到b之间以c为间隔取值,c还可以是负,负值意味着取反。如s[::-1]意味着,将这个list倒置

给切片赋值:

l=list(range(5))

print(l) [0,1,2,3,4]

l[1:3]=[20,30]

print(l) [0,20,30,4]

l[1:3]=100 报错,需要写成[100]

对序列使用+和*

+是把两个序列合并,在拼接过程中,两个被操作对序列都不会被修改,Python会新建一个包含同类型数据对序列作为拼接结果。

是把序列复制几份然后拼接起来。例如 l=[1,2] l 3=[1,2,1,2,1,2] *也会构建新的序列而不修改原有的对象。

序列的增量赋值

+=背后的特殊方法是 iadd ,但是如果一个类没有实现这个方法,Python会退一步调用 add

第三章 字典和集合

字典推导

country_code = {country: code for code, country in dial_doces} dial_doces是一个元组的list

{code:country.upper() for country, code in country_code.items() if code66}

第一个是把国家作为键,第二个把code作为键

if key not in my_dict:

my_dict[key]=[]

my_dict[key].append(new_value)

可以直接写成my_dict.setdefault(key,[]).append(new_value)

所有映射类型在处理找不到的键的时候,都会牵扯到 missing 方法,

集合

{1,2}这是集合

集合推导

from unicodedata import name

{chr(i) for i in range(32,256) if 'SIGN' in name(chr(i),'')}

a.union(b,c,d) 这里a必须是set,b、c和d则可以是任何类型的可迭代对象

为了获取dict[key]背后的值,python会调用hash(key)来计算key的散列值,然后去散列表里面查找表元,若找到的表元是空的,则抛keyerror,若不是空的,则表元里会有一对found_key:found_value,这个时候Python会检验key == found_key是否为真,如果他们相等的话,会返回found_value。如果不等,说明出现了散列冲突。发生这种情况的原因是,散列表所做的只是把随机的元素映射到只有几位的数字上,而散列表本身的索引又只依赖于这个数字的一部分。为了解决散列冲突,算法会在散列值中另外取几位,然后用特殊方法处理一下,把新得到的数字再当作索引来寻找表元。

dict的实现

1、支持hash()函数,并且通过 hash ()方法所得到的的散列值是不变的。

2、通过 eq ()来检测相等性

3、若a == b,则 hash(a) == hash(b)

往字典添加新键可能会改变已有键的顺序

无论何时往字典里添加新键,python解释器都可能作出字典扩容的决定。扩容导致的结果就是需要新建一个更大的散列表,并把字典里已有的元素添加到新表。这个过程可能会发生散列冲突,导致新散列表次序发生变化。

由此可知,不要对字典同时进行迭代和修改。如果你想扫描并修改一个字典,最好分成两步来解决,首先对字典迭代,以得出需要添加对内容,把这些内容放到一个新字典里,迭代结束之后再对原字典进行更新。

字符问题

字节序列-解码-unicode

字符串-解码-unicode

b = str.encode('utf8') 字符串转化成字节码 是编码

b.decode('utf8') 把字节码还原成字符串 是解码

一等函数

一等函数满足以下条件:

1、在运行时创建

2、能赋值给变量或数据结构中的元素

3、能作为参数传给函数

4、能作为函数的返回结果

高阶函数

接受函数为参数,或者把函数作为结果返回的函数时高阶函数。

匿名函数

通过对比可以看出,匿名函数lambda x: x * x实际上就是:

def f(x):

return x * x

关键字lambda表示匿名函数,冒号前面的x表示函数参数。

可调用类型

任何python对象都可以表现的像函数。只需要实现实例方法 call

实现 call 方法的类是创建函数类对象的简便方式

函数内省

可以用dir(len)查看所有的函数属性

sorted(set(dir(func))-set(dir(obj))) 计算差集 然后排序 得到类的实例没有 而函数有的属性列表

==运算符比较两个对象的值(对象中保存的数据),而is是比较对象的标识。

通常,我们关注的是值,而不是标识,因此python中==出现的频率比is高。

a==b是语法糖,等同于a. eq (b) 装饰器也是语法糖

本文转载自互联网,如有侵权,联系删除

相关推荐