• 关于

    python3 对象

    的搜索结果

问题

【python问答学堂】15期 排序不支持原生比较的对象

剑曼红尘 2020-05-11 21:30:21 0 浏览量 回答数 1

回答

Python JSON本章节我们将为大家介绍如何使用 Python 语言来编码和解码 JSON 对象。JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。JSON 函数使用 JSON 函数需要导入 json 库:import json。函数 描述json.dumps 将 Python 对象编码成 JSON 字符串json.loads 将已编码的 JSON 字符串解码为 Python 对象json.dumpsjson.dumps 用于将 Python 对象编码成 JSON 字符串。语法json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)实例以下实例将数组编码为 JSON 格式数据: !/usr/bin/python import json data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ] json = json.dumps(data)print json以上代码执行结果为:[{"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}]使用参数让 JSON 数据格式化输出: import jsonprint json.dumps({'a': 'Runoob', 'b': 7}, sort_keys=True, indent=4, separators=(',', ': ')){ "a": "Runoob", "b": 7 } python 原始类型向 json 类型的转化对照表:Python JSONdict objectlist, tuple arraystr, unicode stringint, long, float numberTrue trueFalse falseNone nulljson.loadsjson.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型。语法json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])实例以下实例展示了Python 如何解码 JSON 对象: !/usr/bin/python import json jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; text = json.loads(jsonData)print text以上代码执行结果为:{u'a': 1, u'c': 3, u'b': 2, u'e': 5, u'd': 4}json 类型转换到 python 的类型对照表:JSON Pythonobject dictarray liststring unicodenumber (int) int, longnumber (real) floattrue Truefalse Falsenull None更多内容参考:https://docs.python.org/2/library/json.html。使用第三方库:DemjsonDemjson 是 python 的第三方模块库,可用于编码和解码 JSON 数据,包含了 JSONLint 的格式化及校验功能。Github 地址:https://github.com/dmeranda/demjson官方地址:http://deron.meranda.us/python/demjson/环境配置在使用 Demjson 编码或解码 JSON 数据前,我们需要先安装 Demjson 模块。本教程我们会下载 Demjson 并安装:$ tar -xvzf demjson-2.2.3.tar.gz$ cd demjson-2.2.3$ python setup.py install更多安装介绍查看:http://deron.meranda.us/python/demjson/installJSON 函数函数 描述encode 将 Python 对象编码成 JSON 字符串decode 将已编码的 JSON 字符串解码为 Python 对象encodePython encode() 函数用于将 Python 对象编码成 JSON 字符串。语法demjson.encode(self, obj, nest_level=0)实例以下实例将数组编码为 JSON 格式数据: !/usr/bin/python import demjson data = [ { 'a' : 1, 'b' : 2, 'c' : 3, 'd' : 4, 'e' : 5 } ] json = demjson.encode(data)print json以上代码执行结果为:[{"a":1,"b":2,"c":3,"d":4,"e":5}]decodePython 可以使用 demjson.decode() 函数解码 JSON 数据。该函数返回 Python 字段的数据类型。语法demjson.decode(self, txt)实例以下实例展示了Python 如何解码 JSON 对象: !/usr/bin/python import demjson json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; text = demjson.decode(json)print text以上代码执行结果为:{u'a': 1, u'c': 3, u'b': 2, u'e': 5, u'd': 4}

xuning715 2019-12-02 01:10:43 0 浏览量 回答数 0

回答

往期回顾: python问答学堂-《python进阶大全》中你必须掌握的QA 【python问答学堂】2期解压序列赋值给多个变量? 【python问答学堂】3解压可迭代对象赋值给多个变量? 【python问答学堂】4期保留最后 N 个元素? 【python问答学堂】5期 查找最大或最小的 N 个元素 【python问答学堂】6期 实现一个优先级队列 【python问答学堂】7期 字典中的键映射多个值 【python问答学堂】8期 字典排序 【python问答学堂】9期 字典的运算 【python问答学堂】10期 查找两字典的相同点 【python问答学堂】11期 删除序列相同元素并保持顺序 【python问答学堂】12期 命令切片 【python问答学堂】13期 序列中出现次数最多的元素 【python问答学堂】14期 通过某个关键字排序一个字典列表 【python问答学堂】15期 排序不支持原生比较的对象 过滤序列元素 【python问答学堂】16期 从字典中提取子集【python问答学堂】17期 映射名称到序列元素【python问答学堂】18期

剑曼红尘 2020-05-18 11:16:43 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

问题

转换并同时计算数据【python问答学堂】19期

剑曼红尘 2020-05-18 11:16:36 0 浏览量 回答数 1

回答

往期回顾: python问答学堂-《python进阶大全》中你必须掌握的QA 【python问答学堂】2期解压序列赋值给多个变量? 【python问答学堂】3解压可迭代对象赋值给多个变量? 【python问答学堂】4期保留最后 N 个元素? 【python问答学堂】5期 查找最大或最小的 N 个元素 【python问答学堂】6期 实现一个优先级队列 【python问答学堂】7期 字典中的键映射多个值 【python问答学堂】8期 字典排序 【python问答学堂】9期 字典的运算 【python问答学堂】10期 查找两字典的相同点 【python问答学堂】11期 删除序列相同元素并保持顺序 【python问答学堂】12期 命令切片 【python问答学堂】13期 序列中出现次数最多的元素 【python问答学堂】14期 通过某个关键字排序一个字典列表 【python问答学堂】15期 排序不支持原生比较的对象 过滤序列元素 【python问答学堂】16期 从字典中提取子集【python问答学堂】17期 映射名称到序列元素【python问答学堂】18期 转换并同时计算数据【python问答学堂】19期

剑曼红尘 2020-05-19 13:08:30 0 浏览量 回答数 0

问题

合并多个字典或映射【python问答学堂】20期

剑曼红尘 2020-05-19 13:08:22 0 浏览量 回答数 1

回答

许多Python初学者都会问:我应该学习哪个版本的Python。对于这个问题,我的回答通常是“先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用那个版本。等学得差不多了,再来研究不同版本之间的差别”。 许多Python初学者都会问:我应该学习哪个版本的Python。对于这个问题,我的回答通常是“先选择一个最适合你的Python教程,教程中使用哪个版本的Python,你就用那个版本。等学得差不多了,再来研究不同版本之间的差别”。但如果想要用Python开发一个新项目,那么该如何选择Python版本呢?我可以负责任的说,大部分Python库都同时支持Python 2.7.x和3.x版本的,所以不论选择哪个版本都是可以的。但为了在使用Python时避开某些版本中一些常见的陷阱,或需要移植某个Python项目时,依然有必要了解一下Python两个常见版本之间的主要区别。__future__模块Python 3.x引入了一些与Python 2不兼容的关键字和特性,在Python 2中,可以通过内置的__future__模块导入这些新内容。如果你希望在Python 2环境下写的代码也可以在Python 3.x中运行,那么建议使用__future__模块。例如,如果希望在Python 2中拥有Python 3.x的整数除法行为,可以通过下面的语句导入相应的模块。from future import division 下表列出了__future__中其他可导入的特性:特性 可选版本 强制版本 效果nested_scopes 2.1.0b1 2.2 PEP 227:Statically Nested Scopesgenerators 2.2.0a1 2.3 PEP 255:Simple Generatorsdivision 2.2.0a2 3.0 PEP 238:Changing the Division Operatorabsolute_import 2.5.0a1 3.0 PEP 328:Imports: Multi-Line and Absolute/Relativewith_statement 2.5.0a1 2.6 PEP 343:The “with” Statementprint_function 2.6.0a2 3.0 PEP 3105:Make print a functionunicode_literals 2.6.0a2 3.0 PEP 3112:Bytes literals in Python 3000(来源: https://docs.python.org/2/library/future.html)示例:from platform import python_version print函数虽然print语法是Python 3中一个很小的改动,且应该已经广为人知,但依然值得提一下:Python 2中的print语句被Python 3中的print()函数取代,这意味着在Python 3中必须用括号将需要输出的对象括起来。在Python 2中使用额外的括号也是可以的。但反过来在Python 3中想以Python2的形式不带括号调用print函数时,会触发SyntaxError。Python 2print 'Python', python_version() print 'Hello, World!' print('Hello, World!') print "text", ; print 'print more text on the same line' Python 2.7.6 Hello, World! Hello, World! text print more text on the same line Python 3print('Python', python_version()) print('Hello, World!') print("some text,", end="") print(' print more text on the same line') Python 3.4.1 Hello, World! some text, print more text on the same line print 'Hello, World!' File "", line 1 print 'Hello, World!' ^ SyntaxError: invalid syntax 注意:在Python中,带不带括号输出”Hello World”都很正常。但如果在圆括号中同时输出多个对象时,就会创建一个元组,这是因为在Python 2中,print是一个语句,而不是函数调用。print 'Python', python_version() print('a', 'b') print 'a', 'b' Python 2.7.7 ('a', 'b') a b 整数除法由于人们常常会忽视Python 3在整数除法上的改动(写错了也不会触发Syntax Error),所以在移植代码或在Python 2中执行Python 3的代码时,需要特别注意这个改动。所以,我还是会在Python 3的脚本中尝试用float(3)/2或 3/2.0代替3/2,以此来避免代码在Python 2环境下可能导致的错误(或与之相反,在Python 2脚本中用from future import division来使用Python 3的除法)。Python 2print 'Python', python_version() print '3 / 2 =', 3 / 2 print '3 // 2 =', 3 // 2 print '3 / 2.0 =', 3 / 2.0 print '3 // 2.0 =', 3 // 2.0 Python 2.7.6 3 / 2 = 1 3 // 2 = 1 3 / 2.0 = 1.5 3 // 2.0 = 1.0 Python 3print('Python', python_version()) print('3 / 2 =', 3 / 2) print('3 // 2 =', 3 // 2) print('3 / 2.0 =', 3 / 2.0) print('3 // 2.0 =', 3 // 2.0) Python 3.4.1 3 / 2 = 1.5 3 // 2 = 1 3 / 2.0 = 1.5 3 // 2.0 = 1.0 UnicodePython 2有基于ASCII的str()类型,其可通过单独的unicode()函数转成unicode类型,但没有byte类型。而在Python 3中,终于有了Unicode(utf-8)字符串,以及两个字节类:bytes和bytearrays。Python 2print 'Python', python_version() Python 2.7.6 print type(unicode('this is like a python3 str type')) print type(b'byte type does not exist') print 'they are really' + b' the same' they are really the same print type(bytearray(b'bytearray oddly does exist though')) Python 3print('Python', python_version()) print('strings are now utf-8 u03BCnicou0394é!') Python 3.4.1 strings are now utf-8 μnicoΔé! print('Python', python_version(), end="") print(' has', type(b' bytes for storing data')) Python 3.4.1 has print('and Python', python_version(), end="") print(' also has', type(bytearray(b'bytearrays'))) and Python 3.4.1 also has 'note that we cannot add a string' + b'bytes for data' TypeError Traceback (most recent call last) in () ----> 1 'note that we cannot add a string' + b'bytes for data' TypeError: Can't convert 'bytes' object to str implicitly xrange在Python 2.x中,经常会用xrange()创建一个可迭代对象,通常出现在“for循环”或“列表/集合/字典推导式”中。这种行为与生成器非常相似(如”惰性求值“),但这里的xrange-iterable无尽的,意味着可能在这个xrange上无限迭代。由于xrange的“惰性求知“特性,如果只需迭代一次(如for循环中),range()通常比xrange()快一些。不过不建议在多次迭代中使用range(),因为range()每次都会在内存中重新生成一个列表。在Python 3中,range()的实现方式与xrange()函数相同,所以就不存在专用的xrange()(在Python 3中使用xrange()会触发NameError)。import timeit n = 10000 def test_range(n): return for i in range(n): pass def test_xrange(n): for i in xrange(n): pass Python 2print 'Python', python_version() print 'ntiming range()' %timeit test_range(n) print 'nntiming xrange()' %timeit test_xrange(n) Python 2.7.6 timing range() 1000 loops, best of 3: 433 µs per loop timing xrange() 1000 loops, best of 3: 350 µs per loop Python 3print('Python', python_version()) print('ntiming range()') %timeit test_range(n) Python 3.4.1 timing range() 1000 loops, best of 3: 520 µs per loop print(xrange(10)) NameError Traceback (most recent call last) in () ----> 1 print(xrange(10)) NameError: name 'xrange' is not defined Python 3中的range对象中的__contains__方法另一个值得一提的是,在Python 3.x中,range有了一个新的__contains__方法。__contains__方法可以有效的加快Python 3.x中整数和布尔型的“查找”速度。x = 10000000 def val_in_range(x, val): return val in range(x) def val_in_xrange(x, val): return val in xrange(x) print('Python', python_version()) assert(val_in_range(x, x/2) == True) assert(val_in_range(x, x//2) == True) %timeit val_in_range(x, x/2) %timeit val_in_range(x, x//2) Python 3.4.1 1 loops, best of 3: 742 ms per loop 1000000 loops, best of 3: 1.19 µs per loop 根据上面的timeit的结果,查找整数比查找浮点数要快大约6万倍。但由于Python 2.x中的range或xrange没有__contains__方法,所以在Python 2中的整数和浮点数的查找速度差别不大。print 'Python', python_version() assert(val_in_xrange(x, x/2.0) == True) assert(val_in_xrange(x, x/2) == True) assert(val_in_range(x, x/2) == True) assert(val_in_range(x, x//2) == True) %timeit val_in_xrange(x, x/2.0) %timeit val_in_xrange(x, x/2) %timeit val_in_range(x, x/2.0) %timeit val_in_range(x, x/2) Python 2.7.7 1 loops, best of 3: 285 ms per loop 1 loops, best of 3: 179 ms per loop 1 loops, best of 3: 658 ms per loop 1 loops, best of 3: 556 ms per loop 下面的代码证明了Python 2.x中没有__contain__方法:print('Python', python_version()) range.__contains__ Python 3.4.1 print('Python', python_version()) range.__contains__ Python 2.7.7 AttributeError Traceback (most recent call last) in () 1 print 'Python', python_version() ----> 2 range.__contains__ AttributeError: 'builtin_function_or_method' object has no attribute '__contains__' print('Python', python_version()) xrange.__contains__ Python 2.7.7 AttributeError Traceback (most recent call last) in () 1 print 'Python', python_version() ----> 2 xrange.__contains__ AttributeError: type object 'xrange' has no attribute '__contains__' 关于Python 2中xrange()与Python 3中range()之间的速度差异的一点说明:有读者指出了Python 3中的range()和Python 2中xrange()执行速度有差异。由于这两者的实现方式相同,因此理论上执行速度应该也是相同的。这里的速度差别仅仅是因为Python 3的总体速度就比Python 2慢。def test_while(): i = 0 while i < 20000: i += 1 return print('Python', python_version()) %timeit test_while() Python 3.4.1 %timeit test_while() 100 loops, best of 3: 2.68 ms per loop print 'Python', python_version() %timeit test_while() Python 2.7.6 1000 loops, best of 3: 1.72 ms per loop 触发异常Python 2支持新旧两种异常触发语法,而Python 3只接受带括号的的语法(不然会触发SyntaxError):Python 2print 'Python', python_version()Python 2.7.6 raise IOError, "file error" IOError Traceback (most recent call last) in ()----> 1 raise IOError, "file error" IOError: file error raise IOError("file error") IOError Traceback (most recent call last) in ()----> 1 raise IOError("file error") IOError: file errorPython 3print('Python', python_version())Python 3.4.1raise IOError, "file error"File "", line 1raise IOError, "file error"^SyntaxError: invalid syntaxThe proper way to raise an exception in Python 3:print('Python', python_version())raise IOError("file error")Python 3.4.1 OSError Traceback (most recent call last) in ()1 print('Python', python_version())----> 2 raise IOError("file error") OSError: file error异常处理Python 3中的异常处理也发生了一点变化。在Python 3中必须使用“as”关键字。Python 2print 'Python', python_version()try: let_us_cause_a_NameError except NameError, err: print err, '--> our error message' Python 2.7.6name 'let_us_cause_a_NameError' is not defined --> our error messagePython 3print('Python', python_version())try: let_us_cause_a_NameError except NameError as err: print(err, '--> our error message') Python 3.4.1name 'let_us_cause_a_NameError' is not defined --> our error messagenext()函数和.next()方法由于会经常用到next()(.next())函数(方法),所以还要提到另一个语法改动(实现方面也做了改动):在Python 2.7.5中,函数形式和方法形式都可以使用,而在Python 3中,只能使用next()函数(试图调用.next()方法会触发AttributeError)。Python 2print 'Python', python_version()my_generator = (letter for letter in 'abcdefg')next(my_generator)my_generator.next()Python 2.7.6'b'Python 3print('Python', python_version())my_generator = (letter for letter in 'abcdefg')next(my_generator)Python 3.4.1'a' my_generator.next() AttributeError Traceback (most recent call last) in ()----> 1 my_generator.next() AttributeError: 'generator' object has no attribute 'next'For循环变量与全局命名空间泄漏好消息是:在Python 3.x中,for循环中的变量不再会泄漏到全局命名空间中了!这是Python 3.x中做的一个改动,在“What’s New In Python 3.0”中有如下描述:“列表推导不再支持[… for var in item1, item2, …]这样的语法,使用[… for var in (item1, item2, …)]代替。还要注意列表推导有不同的语义:现在列表推导更接近list()构造器中的生成器表达式这样的语法糖,特别要注意的是,循环控制变量不会再泄漏到循环周围的空间中了。”Python 2print 'Python', python_version() i = 1print 'before: i =', i print 'comprehension: ', [i for i in range(5)] print 'after: i =', iPython 2.7.6before: i = 1comprehension: [0, 1, 2, 3, 4]after: i = 4Python 3print('Python', python_version()) i = 1print('before: i =', i) print('comprehension:', [i for i in range(5)]) print('after: i =', i)Python 3.4.1before: i = 1comprehension: [0, 1, 2, 3, 4]after: i = 1比较无序类型Python 3中另一个优秀的改动是,如果我们试图比较无序类型,会触发一个TypeError。Python 2print 'Python', python_version()print "[1, 2] > 'foo' = ", [1, 2] > 'foo'print "(1, 2) > 'foo' = ", (1, 2) > 'foo'print "[1, 2] > (1, 2) = ", [1, 2] > (1, 2)Python 2.7.6[1, 2] > 'foo' = False(1, 2) > 'foo' = True[1, 2] > (1, 2) = FalsePython 3print('Python', python_version())print("[1, 2] > 'foo' = ", [1, 2] > 'foo')print("(1, 2) > 'foo' = ", (1, 2) > 'foo')print("[1, 2] > (1, 2) = ", [1, 2] > (1, 2)) Python 3.4.1 TypeError Traceback (most recent call last) in ()1 print('Python', python_version())----> 2 print("[1, 2] > 'foo' = ", [1, 2] > 'foo')3 print("(1, 2) > 'foo' = ", (1, 2) > 'foo')4 print("[1, 2] > (1, 2) = ", [1, 2] > (1, 2))TypeError: unorderable types: list() > str()通过input()解析用户的输入幸运的是,Python 3改进了input()函数,这样该函数就会总是将用户的输入存储为str对象。在Python 2中,为了避免读取非字符串类型会发生的一些危险行为,不得不使用raw_input()代替input()。Python 2Python 2.7.6[GCC 4.0.1 (Apple Inc. build 5493)] on darwinType "help", "copyright", "credits" or "license" for more information. my_input = input('enter a number: ') enter a number: 123 type(my_input) my_input = raw_input('enter a number: ') enter a number: 123 type(my_input) Python 3Python 3.4.1[GCC 4.2.1 (Apple Inc. build 5577)] on darwinType "help", "copyright", "credits" or "license" for more information. my_input = input('enter a number: ') enter a number: 123 type(my_input) 返回可迭代对象,而不是列表在xrange一节中可以看到,某些函数和方法在Python中返回的是可迭代对象,而不像在Python 2中返回列表。由于通常对这些对象只遍历一次,所以这种方式会节省很多内存。然而,如果通过生成器来多次迭代这些对象,效率就不高了。此时我们的确需要列表对象,可以通过list()函数简单的将可迭代对象转成列表。Python 2print 'Python', python_version() print range(3)print type(range(3))Python 2.7.6[0, 1, 2]Python 3print('Python', python_version())print(range(3))print(type(range(3)))print(list(range(3)))Python 3.4.1range(0, 3)[0, 1, 2]下面列出了Python 3中其他不再返回列表的常用函数和方法:zip()map()filter()字典的.key()方法字典的.value()方法字典的.item()方法 __future__模块 [回到目录] Python 3.x引入了一些与Python 2不兼容的关键字和特性,在Python 2中,可以通过内置的__future__模块导入这些新内容。如果你希望在Python 2环境下写的代码也可以在Python 3.x中运行,那么建议使用__future__模块。例如,如果希望在Python 2中拥有Python 3.x的整数除法行为,可以通过下面的语句导入相应的模块。 ? 1 from future import division 下表列出了__future__中其他可导入的特性: 特性 可选版本 强制版本 效果 nested_scopes 2.1.0b1 2.2 PEP 227:Statically Nested Scopes generators 2.2.0a1 2.3 PEP 255:Simple Generators division 2.2.0a2 3.0 PEP 238:Changing the Division Operator absolute_import 2.5.0a1 3.0 PEP 328:Imports: Multi-Line and Absolute/Relative with_statement 2.5.0a1 2.6 PEP 343:The “with” Statement print_function 2.6.0a2 3.0 PEP 3105:Make print a function unicode_literals 2.6.0a2 3.0 PEP 3112:Bytes literals in Python 3000 (来源: https://docs.python.org/2/library/future.html) 示例: ? 1 from platform import python_version print函数 [回到目录] 虽然print语法是Python 3中一个很小的改动,且应该已经广为人知,但依然值得提一下:Python 2中的print语句被Python 3中的print()函数取代,这意味着在Python 3中必须用括号将需要输出的对象括起来。 在Python 2中使用额外的括号也是可以的。但反过来在Python 3中想以Python2的形式不带括号调用print函数时,会触发SyntaxError。 Python 2 ? 1234 print 'Python', python_version()print 'Hello, World!'print('Hello, World!')print "text", ; print 'print more text on the same line' ? 1234 Python 2.7.6Hello, World!Hello, World!text print more text on the same line Python 3 ? 12345 print('Python', python_version())print('Hello, World!') print("some text,", end="") print(' print more text on the same line') ? 123 Python 3.4.1Hello, World!some text, print more text on the same line ? 1 print 'Hello, World!' ? File "", line 1print 'Hello, World!'^SyntaxError: invalid syntax 注意: 在Python中,带不带括号输出”Hello World”都很正常。但如果在圆括号中同时输出多个对象时,就会创建一个元组,这是因为在Python 2中,print是一个语句,而不是函数调用。 ? 123 print 'Python', python_version()print('a', 'b')print 'a', 'b' Python 2.7.7('a', 'b')a b 整数除法 [回到目录] 由于人们常常会忽视Python 3在整数除法上的改动(写错了也不会触发Syntax Error),所以在移植代码或在Python 2中执行Python 3的代码时,需要特别注意这个改动。 所以,我还是会在Python 3的脚本中尝试用float(3)/2或 3/2.0代替3/2,以此来避免代码在Python 2环境下可能导致的错误(或与之相反,在Python 2脚本中用from future import division来使用Python 3的除法)。 Python 2 ? 12345 print 'Python', python_version()print '3 / 2 =', 3 / 2print '3 // 2 =', 3 // 2print '3 / 2.0 =', 3 / 2.0print '3 // 2.0 =', 3 // 2.0 Python 2.7.63 / 2 = 13 // 2 = 13 / 2.0 = 1.53 // 2.0 = 1.0 Python 3 ? 12345 print('Python', python_version())print('3 / 2 =', 3 / 2)print('3 // 2 =', 3 // 2)print('3 / 2.0 =', 3 / 2.0)print('3 // 2.0 =', 3 // 2.0) Python 3.4.13 / 2 = 1.53 // 2 = 13 / 2.0 = 1.53 // 2.0 = 1.0 Unicode [回到目录] Python 2有基于ASCII的str()类型,其可通过单独的unicode()函数转成unicode类型,但没有byte类型。 而在Python 3中,终于有了Unicode(utf-8)字符串,以及两个字节类:bytes和bytearrays。 Python 2 ? 1 print 'Python', python_version() Python 2.7.6 ? 1 print type(unicode('this is like a python3 str type')) ? 1 print type(b'byte type does not exist') ? 1 print 'they are really' + b' the same' they are really the same ? 1 print type(bytearray(b'bytearray oddly does exist though')) Python 3 ? 12 print('Python', python_version())print('strings are now utf-8 u03BCnicou0394é!') Python 3.4.1strings are now utf-8 μnicoΔé! ? 12 print('Python', python_version(), end="")print(' has', type(b' bytes for storing data')) Python 3.4.1 has ? 12 print('and Python', python_version(), end="")print(' also has', type(bytearray(b'bytearrays'))) and Python 3.4.1 also has ? 1 'note that we cannot add a string' + b'bytes for data' TypeError Traceback (most recent call last) in ()----> 1 'note that we cannot add a string' + b'bytes for data' TypeError: Can't convert 'bytes' object to str implicitly xrange [回到目录] 在Python 2.x中,经常会用xrange()创建一个可迭代对象,通常出现在“for循环”或“列表/集合/字典推导式”中。 这种行为与生成器非常相似(如”惰性求值“),但这里的xrange-iterable无尽的,意味着可能在这个xrange上无限迭代。 由于xrange的“惰性求知“特性,如果只需迭代一次(如for循环中),range()通常比xrange()快一些。不过不建议在多次迭代中使用range(),因为range()每次都会在内存中重新生成一个列表。 在Python 3中,range()的实现方式与xrange()函数相同,所以就不存在专用的xrange()(在Python 3中使用xrange()会触发NameError)。 ? 12345678910 import timeit n = 10000def test_range(n): return for i in range(n): pass def test_xrange(n): for i in xrange(n): pass Python 2 ? 1234567 print 'Python', python_version() print 'ntiming range()'%timeit test_range(n) print 'nntiming xrange()'%timeit test_xrange(n) Python 2.7.6 timing range()1000 loops, best of 3: 433 µs per loop timing xrange()1000 loops, best of 3: 350 µs per loop Python 3 ? 1234 print('Python', python_version()) print('ntiming range()')%timeit test_range(n) Python 3.4.1 timing range()1000 loops, best of 3: 520 µs per loop ? 1 print(xrange(10)) NameError Traceback (most recent call last)in ()----> 1 print(xrange(10)) NameError: name 'xrange' is not defined Python 3中的range对象中的__contains__方法 另一个值得一提的是,在Python 3.x中,range有了一个新的__contains__方法。__contains__方法可以有效的加快Python 3.x中整数和布尔型的“查找”速度。 ? 123456789101112 x = 10000000def val_in_range(x, val): return val in range(x) def val_in_xrange(x, val): return val in xrange(x) print('Python', python_version())assert(val_in_range(x, x/2) == True)assert(val_in_range(x, x//2) == True)%timeit val_in_range(x, x/2)%timeit val_in_range(x, x//2) Python 3.4.11 loops, best of 3: 742 ms per loop1000000 loops, best of 3: 1.19 µs per loop 根据上面的timeit的结果,查找整数比查找浮点数要快大约6万倍。但由于Python 2.x中的range或xrange没有__contains__方法,所以在Python 2中的整数和浮点数的查找速度差别不大。 ? 12345678910 print 'Python', python_version() assert(val_in_xrange(x, x/2.0) == True)assert(val_in_xrange(x, x/2) == True)assert(val_in_range(x, x/2) == True)assert(val_in_range(x, x//2) == True)%timeit val_in_xrange(x, x/2.0)%timeit val_in_xrange(x, x/2)%timeit val_in_range(x, x/2.0)%timeit val_in_range(x, x/2) Python 2.7.71 loops, best of 3: 285 ms per loop1 loops, best of 3: 179 ms per loop1 loops, best of 3: 658 ms per loop1 loops, best of 3: 556 ms per loop 下面的代码证明了Python 2.x中没有__contain__方法: ? 12 print('Python', python_version())range.__contains__ Python 3.4.1 ? 12 print('Python', python_version())range.__contains__ Python 2.7.7 AttributeError Traceback (most recent call last) in ()1 print 'Python', python_version()----> 2 range.__contains__ AttributeError: 'builtin_function_or_method' object has no attribute '__contains__' ? 12 print('Python', python_version())xrange.__contains__ Python 2.7.7 AttributeError Traceback (most recent call last)in ()1 print 'Python', python_version()----> 2 xrange.__contains__ AttributeError: type object 'xrange' has no attribute '__contains__' 关于Python 2中xrange()与Python 3中range()之间的速度差异的一点说明: 有读者指出了Python 3中的range()和Python 2中xrange()执行速度有差异。由于这两者的实现方式相同,因此理论上执行速度应该也是相同的。这里的速度差别仅仅是因为Python 3的总体速度就比Python 2慢。 ? 12345 def test_while(): i = 0 while i < 20000: i += 1 return ? 12 print('Python', python_version())%timeit test_while() Python 3.4.1%timeit test_while()100 loops, best of 3: 2.68 ms per loop ? 12 print 'Python', python_version()%timeit test_while() Python 2.7.61000 loops, best of 3: 1.72 ms per loop 触发异常 [回到目录] Python 2支持新旧两种异常触发语法,而Python 3只接受带括号的的语法(不然会触发SyntaxError): Python 2 ? 1 print 'Python', python_version() Python 2.7.6 ? 1 raise IOError, "file error" IOError Traceback (most recent call last) in ()----> 1 raise IOError, "file error" IOError: file error ? 1 raise IOError("file error") IOError Traceback (most recent call last) in ()----> 1 raise IOError("file error") IOError: file error Python 3 ? 1 print('Python', python_version()) Python 3.4.1 ? 1 raise IOError, "file error" File "", line 1raise IOError, "file error"^SyntaxError: invalid syntaxThe proper way to raise an exception in Python 3: ? 12 print('Python', python_version())raise IOError("file error") Python 3.4.1 OSError Traceback (most recent call last) in ()1 print('Python', python_version())----> 2 raise IOError("file error") OSError: file error 异常处理 [回到目录] Python 3中的异常处理也发生了一点变化。在Python 3中必须使用“as”关键字。 Python 2 ? 12345 print 'Python', python_version()try: let_us_cause_a_NameErrorexcept NameError, err: print err, '--> our error message' Python 2.7.6name 'let_us_cause_a_NameError' is not defined --> our error message Python 3 ? 12345 print('Python', python_version())try: let_us_cause_a_NameErrorexcept NameError as err: print(err, '--> our error message') Python 3.4.1name 'let_us_cause_a_NameError' is not defined --> our error message next()函数和.next()方法 [回到目录] 由于会经常用到next()(.next())函数(方法),所以还要提到另一个语法改动(实现方面也做了改动):在Python 2.7.5中,函数形式和方法形式都可以使用,而在Python 3中,只能使用next()函数(试图调用.next()方法会触发AttributeError)。 Python 2 ? 1234 print 'Python', python_version()my_generator = (letter for letter in 'abcdefg')next(my_generator)my_generator.next() Python 2.7.6'b' Python 3 ? 123 print('Python', python_version())my_generator = (letter for letter in 'abcdefg')next(my_generator) Python 3.4.1'a' ? 1 my_generator.next() AttributeError Traceback (most recent call last) in ()----> 1 my_generator.next() AttributeError: 'generator' object has no attribute 'next' For循环变量与全局命名空间泄漏 [回到目录] 好消息是:在Python 3.x中,for循环中的变量不再会泄漏到全局命名空间中了! 这是Python 3.x中做的一个改动,在“What's New In Python 3.0”中有如下描述: “列表推导不再支持[... for var in item1, item2, ...]这样的语法,使用[... for var in (item1, item2, ...)]代替。还要注意列表推导有不同的语义:现在列表推导更接近list()构造器中的生成器表达式这样的语法糖,特别要注意的是,循环控制变量不会再泄漏到循环周围的空间中了。” Python 2 ? 12345678 print 'Python', python_version() i = 1print 'before: i =', i print 'comprehension: ', [i for i in range(5)] print 'after: i =', i Python 2.7.6before: i = 1comprehension: [0, 1, 2, 3, 4]after: i = 4 Python 3 ? 12345678 print('Python', python_version()) i = 1print('before: i =', i) print('comprehension:', [i for i in range(5)]) print('after: i =', i) Python 3.4.1before: i = 1comprehension: [0, 1, 2, 3, 4]after: i = 1 比较无序类型 [回到目录] Python 3中另一个优秀的改动是,如果我们试图比较无序类型,会触发一个TypeError。 Python 2 ? 1234 print 'Python', python_version()print "[1, 2] > 'foo' = ", [1, 2] > 'foo'print "(1, 2) > 'foo' = ", (1, 2) > 'foo'print "[1, 2] > (1, 2) = ", [1, 2] > (1, 2) Python 2.7.6[1, 2] > 'foo' = False(1, 2) > 'foo' = True[1, 2] > (1, 2) = False Python 3 ? 1234 print('Python', python_version())print("[1, 2] > 'foo' = ", [1, 2] > 'foo')print("(1, 2) > 'foo' = ", (1, 2) > 'foo')print("[1, 2] > (1, 2) = ", [1, 2] > (1, 2)) Python 3.4.1 TypeError Traceback (most recent call last) in ()1 print('Python', python_version())----> 2 print("[1, 2] > 'foo' = ", [1, 2] > 'foo')3 print("(1, 2) > 'foo' = ", (1, 2) > 'foo')4 print("[1, 2] > (1, 2) = ", [1, 2] > (1, 2))TypeError: unorderable types: list() > str() 通过input()解析用户的输入 [回到目录] 幸运的是,Python 3改进了input()函数,这样该函数就会总是将用户的输入存储为str对象。在Python 2中,为了避免读取非字符串类型会发生的一些危险行为,不得不使用raw_input()代替input()。 Python 2 ? 1234567891011121314151617 Python 2.7.6[GCC 4.0.1 (Apple Inc. build 5493)] on darwinType "help", "copyright", "credits" or "license" for more information. my_input = input('enter a number: ') enter a number: 123 type(my_input) my_input = raw_input('enter a number: ') enter a number: 123 type(my_input) Python 3 ? 12345678 Python 3.4.1[GCC 4.2.1 (Apple Inc. build 5577)] on darwinType "help", "copyright", "credits" or "license" for more information. my_input = input('enter a number: ') enter a number: 123 type(my_input) 返回可迭代对象,而不是列表 [回到目录] 在xrange一节中可以看到,某些函数和方法在Python中返回的是可迭代对象,而不像在Python 2中返回列表。 由于通常对这些对象只遍历一次,所以这种方式会节省很多内存。然而,如果通过生成器来多次迭代这些对象,效率就不高了。 此时我们的确需要列表对象,可以通过list()函数简单的将可迭代对象转成列表。 Python 2 ? 1234 print 'Python', python_version() print range(3)print type(range(3)) Python 2.7.6[0, 1, 2] Python 3 ? 1234 print('Python', python_version())print(range(3))print(type(range(3)))print(list(range(3))) Python 3.4.1range(0, 3)[0, 1, 2] 下面列出了Python 3中其他不再返回列表的常用函数和方法:•zip()•map()•filter()•字典的.key()方法•字典的.value()方法•字典的.item()方法 更多关于Python 2和Python 3的文章 [回到目录] 下面列出了其他一些可以进一步了解Python 2和Python 3的优秀文章, //迁移到 Python 3•Should I use Python 2 or Python 3 for my development activity?•What's New In Python 3.0•Porting to Python 3•Porting Python 2 Code to Python 3•How keep Python 3 moving forward // 对Python 3的褒与贬•10 awesome features of Python that you can't use because you refuse to upgrade to Python 3•关于你不想知道的所有Python3 unicode特性•Python 3 正在毁灭 Python•Python 3 能振兴 Python•Python 3 is fine

xuning715 2019-12-02 01:10:35 0 浏览量 回答数 0

回答

Python语言是一种高级语言,是一种面向对象、解释型的程序设计语言;由Guido van Rossum在1989年底发明,第一个公开版本发行与1991年。它遵循GPL协议,是源代码开放的软件。优点:免费的自由软件、跨平台的(基本上支持所有的平台)、功能强大(内置模块和拓展模块可以完成许多强大的操作,还有丰富的第三方库)、清晰优雅。Python同时支持面向过程和面向对象的编程。 安装Python的编辑系统(解释器)https://www.python.org/downloads/ 放上链接,网上有很多教程,这里就不废话了。 值得一提的是,Mac系统自身已经安装了Python,打开终端,输入 python 查看Python的版本 开始编程语言的第一个程序 hello world: 终端输入python 可以看到光标不再闪动,前边变成了>>>,然后输入 print "hellow world",可以看到终端打印hello world 简单的一个程序,算是初识Python。 打开teminal终端,输入:type -a python3,显示python3路径:/usr/local/bin/python3 打开Sublime,Tools -> Build System -> New Build System,输入以下内容: {"cmd": ["/usr/local/bin/python3", "-u", "$file"],} 保存,命名为Python3.sublime-build,默认位置User保存 选择 Tools -> Build System -> Python3即可

xuning715 2019-12-02 01:10:26 0 浏览量 回答数 0

回答

问题 你想排序类型相同的对象,但是他们不支持原生的比较操作。 往期回顾: python问答学堂-《python进阶大全》中你必须掌握的QA 【python问答学堂】2期解压序列赋值给多个变量? 【python问答学堂】3解压可迭代对象赋值给多个变量? 【python问答学堂】4期保留最后 N 个元素? 【python问答学堂】5期 查找最大或最小的 N 个元素 【python问答学堂】6期 实现一个优先级队列 【python问答学堂】7期 字典中的键映射多个值 【python问答学堂】8期 字典排序 【python问答学堂】9期 字典的运算 【python问答学堂】10期 查找两字典的相同点 【python问答学堂】11期 删除序列相同元素并保持顺序 【python问答学堂】12期 命令切片 【python问答学堂】13期 序列中出现次数最多的元素 【python问答学堂】14期 通过某个关键字排序一个字典列表

剑曼红尘 2020-05-11 21:30:58 0 浏览量 回答数 0

回答

《Python核心编程 第3版》《Python编程快速上手让繁琐工作自动化》《“笨办法”学Python(第3版)》《像计算机科学家一样思考Python 第2版》《Python高级编程 第2版》《精通Python自然语言处理》《Python机器学习实践指南》《用Python写网络爬虫》《Python面向对象编程指南》《NLTK基础教程 用NLTK和Python库构建机器学习应用》《Python高性能编程》《Python物理建模初学者指南》

aoteman675 2019-12-02 01:04:58 0 浏览量 回答数 0

问题

映射名称到序列元素【python问答学堂】18期

剑曼红尘 2020-05-15 11:20:51 0 浏览量 回答数 1

回答

问题 你有一段通过下标访问列表或者元组中元素的代码,但是这样有时候会使得你的代码难以阅读, 于是你想通过名称来访问元素。 解决方案 collections.namedtuple() 函数通过使用一个普通的元组对象来帮你解决这个问题。 这个函数实际上是一个返回 Python 中标准元组类型子类的一个工厂方法。 你需要传递一个类型名和你需要的字段给它,然后它就会返回一个类,你可以初始化这个类,为你定义的字段传递值等。 代码示例: 往期回顾: python问答学堂-《python进阶大全》中你必须掌握的QA 【python问答学堂】2期解压序列赋值给多个变量? 【python问答学堂】3解压可迭代对象赋值给多个变量? 【python问答学堂】4期保留最后 N 个元素? 【python问答学堂】5期 查找最大或最小的 N 个元素 【python问答学堂】6期 实现一个优先级队列 【python问答学堂】7期 字典中的键映射多个值 【python问答学堂】8期 字典排序 【python问答学堂】9期 字典的运算 【python问答学堂】10期 查找两字典的相同点 【python问答学堂】11期 删除序列相同元素并保持顺序 【python问答学堂】12期 命令切片 【python问答学堂】13期 序列中出现次数最多的元素 【python问答学堂】14期 通过某个关键字排序一个字典列表 【python问答学堂】15期 排序不支持原生比较的对象 过滤序列元素 【python问答学堂】16期 从字典中提取子集【python问答学堂】17期

剑曼红尘 2020-05-15 11:21:13 0 浏览量 回答数 0

回答

问题 你想构造一个字典,它是另外一个字典的子集。 解决方案 最简单的方式是使用字典推导。比如: 往期回顾: python问答学堂-《python进阶大全》中你必须掌握的QA 【python问答学堂】2期解压序列赋值给多个变量? 【python问答学堂】3解压可迭代对象赋值给多个变量? 【python问答学堂】4期保留最后 N 个元素? 【python问答学堂】5期 查找最大或最小的 N 个元素 【python问答学堂】6期 实现一个优先级队列 【python问答学堂】7期 字典中的键映射多个值 【python问答学堂】8期 字典排序 【python问答学堂】9期 字典的运算 【python问答学堂】10期 查找两字典的相同点 【python问答学堂】11期 删除序列相同元素并保持顺序 【python问答学堂】12期 命令切片 【python问答学堂】13期 序列中出现次数最多的元素 【python问答学堂】14期 通过某个关键字排序一个字典列表 【python问答学堂】15期 排序不支持原生比较的对象 过滤序列元素 【python问答学堂】16期

剑曼红尘 2020-05-14 11:22:45 0 浏览量 回答数 0

问题

从字典中提取子集【python问答学堂】17期

剑曼红尘 2020-05-14 11:22:29 1 浏览量 回答数 1

回答

Python获取帮助的3种方式(转载)我们可以很容易的通过Python解释器获取帮助。如果想知道一个对象(object)更多的信息,那么可以调用help(object)!另外还有一些有用的方法,dir(object)会显示该对象的大部分相关属性名,还有object._ doc _会显示其相对应的文档字符串。下面对其进行逐一介绍。1、 help()help函数是Python的一个内置函数。 函数原型:help([object])。 可以帮助我们了解该对象的更多信息。 2、dir()dir函数是Python的一个内置函数。 函数原型:dir([object]) 可以帮助我们获取该对象的大部分相关属性。 3、_ doc_在Python中有一个奇妙的特性,文档字符串,又称为DocStrings。 用它可以为我们的模块、类、函数等添加说明性的文字,使程序易读易懂,更重要的是可以通过Python自带的标准方法将这些描述性文字信息输出。 上面提到的自带的标准方法就是_ doc _。前后各两个下划线。 注:当不是函数、方法、模块等调用doc时,而是具体对象调用时,会显示此对象从属的类型的构造函数的文档字符串。

世事皆空 2019-12-02 01:07:24 0 浏览量 回答数 0

回答

今天浏览博客的时候看到这么一句话: python中变量名和对象是分离的;最开始的时候是看到这句话的时候没有反应过来。决定具体搞清楚一下python中变量与对象之间的细节。(其实我感觉应该说 引用和对象分离 更为贴切)   从最开始的变量开始思考:    在python中,如果要使用一个变量,不需要提前进行声明,只需要在用的时候,给这个变量赋值即可 (这个和C语言等静态类型语言不同,和python为动态类型有关)。    举第一个栗子:     a = 1    这是一个简单的赋值语句,整数 1 为一个对象,a 是一个引用,利用赋值语句,引用a指向了对象1;这边形象比喻一下:这个过程就相当于“放风筝”,变量a就是你手里面的“线”,python就跟那根“线”一样,通过引用来接触和拴住天空中的风筝——对象。    你可以通过python的内置函数 id() 来查看对象的身份(identity),这个所谓的身份其实就是 对象 的内存地址:     注:      python一切皆对象的理念,所以函数也是一个对象,因此可以使用 id() 函数的__doc__方法来查看这个函数的具体描述: 12 id.__doc__ "id(object) -> integer\n\nReturn the identity of an object. This is guaranteed to be unique among\nsimultaneously existing objects.       (Hint: it's the object's memory address.)"       第二个栗子:     a = 2     a = 'banana'    利用上面第一个栗子用到的 id()函数:     123456 a = 1id(a) 24834392 a = 'banana'id(a) 139990659655312    第一个语句中, 2是储存在内存中的一个整数对象,通过赋值 引用a 指向了 对象 1     第二个语句中,内存中建立了一个字符串对象‘banana’,通过赋值 将 引用a 指向了 ‘banana’,同时,对象1不在有引用指向它,它会被python的内存处理机制给当我垃圾回收,释放内存。    第三个栗子:     a = 3     b = 3    通过函数查看 变量a 和 变量b的引用情况:  123456 a = 3b = 3id(a) 10289448 id(b) 10289448  在这里可以看到 这俩个引用 指向了同一个 对象,这是为什么呢? 这个跟python的内存机制有关系,因为对于语言来说,频繁的进行对象的销毁和建立,特别浪费性能。所以在Python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用。    第四个栗子:     1. a = 4     2. b = a(这里就是让引用b指向引用a指向的那个对象)     3. a = a + 2    通过函数查看引用情况:     当执行到第2步的时候,查看一下 a 和 b 的引用:       123456 a = 4b = aid(a) 36151568 id(b) 36151568    可以看到 a 和 b 都指向了 整数对象 4     接下来指向第3步: 12345 a = a+2id(a) 36151520 id(b) 36151568    可以看到 a 的引用改变了,但是 b 的引用未发生改变;a,b指向不同的对象; 第3句对 a 进行了重新赋值,让它指向了新的 对象6;即使是多个引用指向同一个对象,如果一个引用值发生变化,那么实际上是让这个引用指向一个新的引用,并不影响其他的引用的指向。从效果上看,就是各个引用各自独立,互不影响。    第五个栗子(这个栗子会涉及到 python中的 可变数据类型 和 不可变数据类型):    开始这个栗子之前,请记得注意到 第四个栗子的不同之处。      1. L1 = [1, 2, 3]      2. L2 = L1      3. L1[0] = 10    通过函数查看引用情况:      当执行第1步 和 第二步 的时候,查看一下 L1 和 L2 的引用情况: 123456 L1 = [1,2,3]L2 = L1id(L1) 139643051219496 id(L2) 139643051219496     此时 L1 和 L2 的引用相同,都是指向 [1,2,3]这个列表对象。      接下来,继续执行第3步: 1234567 L1[0] = 10id(L1) 139643051219496 id(L2) 139643051219496 L2 [10, 2, 3]     同样的跟第四个栗子那样,修改了其中一个对象的值,但是可以发现 结果 并不与 第四个栗子那样, 在本次实验中,L1 和 L2 的引用没有发生任何变化,但是 列表对象[1,2,3] 的值 变成了 [10,2,3](列表对象改变了)      在该情况下,我们不再对L1这一引用赋值,而是对L1所指向的表的元素赋值。结果是,L2也同时发生变化。      原因何在呢?因为L1,L2的指向没有发生变化,依然指向那个表。表实际上是包含了多个引用的对象(每个引用是一个元素,比如L1[0],L1[1]..., 每个引用指向一个对象,比如1,2,3), 。而L1[0] = 10这一赋值操作,并不是改变L1的指向,而是对L1[0], 也就是表对象的一部份(一个元素),进行操作,所以所有指向该对象的引用都受到影响。 (与之形成对比的是,我们之前的赋值操作都没有对对象自身发生作用,只是改变引用指向。)      列表可以通过引用其元素,改变对象自身(in-place change)。这种对象类型,称为可变数据对象(mutable object),词典也是这样的数据类型。      而像之前的数字和字符串,不能改变对象本身,只能改变引用的指向,称为不可变数据对象(immutable object)。      我们之前学的元组(tuple),尽管可以调用引用元素,但不可以赋值,因此不能改变对象自身,所以也算是immutable object.              is关键字:     当然,我们也可以要想知道是否指向同一个对象,我们可以使用 python的 is 关键词,is用于判断两个引用所指的对象是否相同。     就像上述第四个栗子 当进行到 第1步 和 第2步 的时候: 1234 a = 4 ……id(a) = 36151568b =a ……id(b) = 36151568a is b True    当进行到第3步的时候: 123 a = a + 2 ……id(a) = 36151520a is b ……id(b) = 36151568 False                   突然想到,对于python 的 深拷贝 和 浅拷贝 的理解,也是可以根据这个进行验证,可以通过第五个栗子进行辅助理解。        

xuning715 2019-12-02 01:10:27 0 浏览量 回答数 0

问题

过滤序列元素 【python问答学堂】16期

剑曼红尘 2020-05-13 20:44:47 4 浏览量 回答数 1

回答

问题 你有一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列 解决方案 最简单的过滤序列元素的方法就是使用列表推导。比如: 这里的关键点在于先创建一个 Boolean 序列,指示哪些元素符合条件。 然后 compress() 函数根据这个序列去选择输出对应位置为 True 的元素。 往期回顾: python问答学堂-《python进阶大全》中你必须掌握的QA 【python问答学堂】2期解压序列赋值给多个变量? 【python问答学堂】3解压可迭代对象赋值给多个变量? 【python问答学堂】4期保留最后 N 个元素? 【python问答学堂】5期 查找最大或最小的 N 个元素 【python问答学堂】6期 实现一个优先级队列 【python问答学堂】7期 字典中的键映射多个值 【python问答学堂】8期 字典排序 【python问答学堂】9期 字典的运算 【python问答学堂】10期 查找两字典的相同点 【python问答学堂】11期 删除序列相同元素并保持顺序 【python问答学堂】12期 命令切片 【python问答学堂】13期 序列中出现次数最多的元素 【python问答学堂】14期 通过某个关键字排序一个字典列表 【python问答学堂】15期 排序不支持原生比较的对象

剑曼红尘 2020-05-13 20:45:28 0 浏览量 回答数 0

回答

Python/C API可能是被最广泛使用的方法。它不仅简单,而且可以在C代码中操作你的Python对象。 这种方法需要以特定的方式来编写C代码以供Python去调用它。所有的Python对象都被表示为一种叫做PyObject的结构体,并且Python.h头文件中提供了各种操作它的函数。例如,如果PyObject表示为PyListType(列表类型)时,那么我们便可以使用PyList_Size()函数来获取该结构的长度,类似Python中的len(list)函数。大部分对Python原生对象的基础函数和操作在Python.h头文件中都能找到。 示例 编写一个C扩展,添加所有元素到一个Python列表(所有元素都是数字) 来看一下我们要实现的效果,这里演示了用Python调用C扩展的代码 #Though it looks like an ordinary python import, the addList module is implemented in C import addList l = [1,2,3,4,5] print "Sum of List - " + str(l) + " = " + str(addList.add(l)) 上面的代码和普通的Python文件并没有什么分别,导入并使用了另一个叫做addList的Python模块。唯一差别就是这个模块并不是用Python编写的,而是C。 接下来我们看看如何用C编写addList模块,这可能看起来有点让人难以接受,但是一旦你了解了这之中的各种组成,你就可以一往无前了。 //Python.h has all the required function definitions to manipulate the Python objects #include <Python.h> //This is the function that is called from your python code static PyObject* addList_add(PyObject* self, PyObject* args){ PyObject * listObj; //The input arguments come as a tuple, we parse the args to get the various variables //In this case it's only one list variable, which will now be referenced by listObj if (! PyArg_ParseTuple( args, "O", &listObj )) return NULL; //length of the list long length = PyList_Size(listObj); //iterate over all the elements int i, sum =0; for (i = 0; i < length; i++) { //get an element out of the list - the element is also a python objects PyObject* temp = PyList_GetItem(listObj, i); //we know that object represents an integer - so convert it into C long long elem = PyInt_AsLong(temp); sum += elem; } //value returned back to python code - another python object //build value here converts the C long to a python integer return Py_BuildValue("i", sum); } //This is the docstring that corresponds to our 'add' function. static char addList_docs[] = "add( ): add all elements of the list\n"; /* This table contains the relavent info mapping - <function-name in python module>, <actual-function>, <type-of-args the function expects>, <docstring associated with the function> */ static PyMethodDef addList_funcs[] = { {"add", (PyCFunction)addList_add, METH_VARARGS, addList_docs}, {NULL, NULL, 0, NULL} }; /* addList is the module name, and this is the initialization block of the module. <desired module name>, <the-info-table>, <module's-docstring> */ PyMODINIT_FUNC initaddList(void){ Py_InitModule3("addList", addList_funcs, "Add all ze lists"); } 逐步解释 Python.h头文件中包含了所有需要的类型(Python对象类型的表示)和函数定义(对Python对象的操作)接下来我们编写将要在Python调用的函数, 函数传统的命名方式由{模块名}_{函数名}组成,所以我们将其命名为addList_add然后填写想在模块内实现函数的相关信息表,每行一个函数,以空行作为结束最后的模块初始化块签名为PyMODINIT_FUNC init{模块名}。 函数addList_add接受的参数类型为PyObject类型结构(同时也表示为元组类型,因为Python中万物皆为对象,所以我们先用PyObject来定义)。传入的参数则通过PyArg_ParseTuple()来解析。第一个参数是被解析的参数变量。第二个参数是一个字符串,告诉我们如何去解析元组中每一个元素。字符串的第n个字母正是代表着元组中第n个参数的类型。例如,"i"代表整形,"s"代表字符串类型, "O"则代表一个Python对象。接下来的参数都是你想要通过PyArg_ParseTuple()函数解析并保存的元素。这样参数的数量和模块中函数期待得到的参数数量就可以保持一致,并保证了位置的完整性。例如,我们想传入一个字符串,一个整数和一个Python列表,可以这样去写 int n; char *s; PyObject* list; PyArg_ParseTuple(args, "siO", &n, &s, &list); 在这种情况下,我们只需要提取一个列表对象,并将它存储在listObj变量中。然后用列表对象中的PyList_Size()函数来获取它的长度。就像Python中调用len(list)。 现在我们通过循环列表,使用PyList_GetItem(list, index)函数来获取每个元素。这将返回一个PyObject*对象。既然Python对象也能表示PyIntType,我们只要使用PyInt_AsLong(PyObj *)函数便可获得我们所需要的值。我们对每个元素都这样处理,最后再得到它们的总和。 总和将被转化为一个Python对象并通过Py_BuildValue()返回给Python代码,这里的i表示我们要返回一个Python整形对象。 现在我们已经编写完C模块了。将下列代码保存为setup.py #build the modules from distutils.core import setup, Extension setup(name='addList', version='1.0', \ ext_modules=[Extension('addList', ['adder.c'])]) 并且运行 python setup.py install 现在应该已经将我们的C文件编译安装到我们的Python模块中了。 在一番辛苦后,让我们来验证下我们的模块是否有效 #module that talks to the C code import addList l = [1,2,3,4,5] print "Sum of List - " + str(l) + " = " + str(addList.add(l)) 输出结果如下 Sum of List - [1, 2, 3, 4, 5] = 15 如你所见,我们已经使用Python.h API成功开发出了我们第一个Python C扩展。这种方法看似复杂,但你一旦习惯,它将变的非常有效。 Python调用C代码的另一种方式便是使用Cython让Python编译的更快。但是Cython和传统的Python比起来可以将它理解为另一种语言,所以我们就不在这里过多描述了。

montos 2020-04-16 21:29:07 0 浏览量 回答数 0

问题

【python问答学堂】10期 查找两字典的相同点

剑曼红尘 2020-04-30 13:00:24 51 浏览量 回答数 2

回答

该存储是“未装箱的”,但是每次访问元素时,Python都必须对其进行“装箱”(将其嵌入常规Python对象中),以便对其进行任何处理。例如,您sum(A)遍历数组,并将每个整数一次装在一个常规Python int对象中。那要花时间。在您的中sum(L),所有装箱操作均在创建列表时完成。 因此,最后,阵列通常较慢,但所需的内存却少得多。 这是最新版本的Python 3的相关代码,但是自Python首次发布以来,相同的基本思想也适用于所有CPython实现。 这是访问列表项的代码: PyObject * PyList_GetItem(PyObject op, Py_ssize_t i) { / error checking omitted */ return ((PyListObject *)op) -> ob_item[i]; } 几乎没有什么: somelist[i]只需返回i列表中的第一个对象(CPython中的所有Python对象都是指向结构的指针,该结构的初始段符合a的布局struct PyObject)。 这__getitem__是array带有类型代码的实现l: static PyObject * l_getitem(arrayobject *ap, Py_ssize_t i) { return PyLong_FromLong(((long *)ap->ob_item)[i]); } 原始内存被视为平台本地C long整数的矢量;该i“个C long被读取起来; 然后PyLong_FromLong()调用该方法将本机包装(“框”)C long在Python long对象中(在Python 3中,该对象消除了Python 2 int和之间的区别long,实际上显示为type int)。 此装箱必须为Python int对象分配新的内存,然后将native C long的位喷射到其中。在原始示例的上下文中,此对象的生存期非常短(足够长,足以sum()将内容添加到运行的总计中),然后需要更多时间才能取消分配新int对象。 在CPython实现中,这就是速度差异的来源,永远都是这样,永远都是这样。 问题来源于stack overflow

保持可爱mmm 2020-02-06 23:25:02 0 浏览量 回答数 0

回答

给大家整理的这套python学习路线图,按照此教程来一步步的学习,肯定会对python有更深刻的认识。或许可以喜欢上python这个易学,精简,开源的语言。此套教程,不但有视频教程,还有源码分享,让大家能真正打开python的大门,进入这个领域。现在互联网巨头,都已经转投到人工智能领域,而人工智能最好的编程语言就是python,未来前景显而易见。黑马程序员的PYthon是国内最早开设的真正人工智能课程一、首先先推荐一个教程8天深入理解python教程:http://pan.baidu.com/s/1kVNmOar主要讲解,python开发环境的构建,基础的数据类型,字符串如何处理等简单的入门级教程。二、第二个教程,是系统的基础知识,学习周期大概一个月左右的时间,根据自己的学习能力吸收能力来定。 初学者只要跟着此套教程学习,入门完全没有问题。 学完后可掌握的核心能力1、掌握基本的Linux系统操作;2、掌握Python基础编程语法;3、建立起编程思维和面向对象思想;可解决的现实问题:字符串排序,切割,逆置;猜数字、飞机大战游戏;市场价值:具备编程思维,掌握Python基本语法,能开发出一些小游戏所涉及知识点: Linux基本命令Python语法基础Python字符串解析Python时间和日历Python文件操作Python面向对象设计模式异常模块项目实战:飞机大战教程地址:http://pan.baidu.com/s/1i5mfB4D三、拓展教程1、网络爬虫-利用python实现爬取网页神技第一天:https://pan.baidu.com/s/1b3CXYI第二天:https://pan.baidu.com/s/1gfDSvHx2、Python之web开发利刃第一天:https://pan.baidu.com/s/1nvPmp6p第二天:https://pan.baidu.com/s/1hrVlRMk3、python之大数据开发奇兵https://pan.baidu.com/s/1eRBDjCQ

1702401060091468 2019-12-02 00:11:45 0 浏览量 回答数 0

回答

问题 怎样在两个字典中寻寻找相同点(比如相同的键、相同的值等等)? 解决方案 考虑下面两个字典: 讨论 一个字典就是一个键集合与值集合的映射关系。 字典的 keys() 方法返回一个展现键集合的键视图对象。 键视图的一个很少被了解的特性就是它们也支持集合操作,比如集合并、交、差运算。 所以,如果你想对集合的键执行一些普通的集合操作,可以直接使用键视图对象而不用先将它们转换成一个 set。 字典的 items() 方法返回一个包含 (键,值) 对的元素视图对象。 这个对象同样也支持集合操作,并且可以被用来查找两个字典有哪些相同的键值对。 尽管字典的 values() 方法也是类似,但是它并不支持这里介绍的集合操作。 某种程度上是因为值视图不能保证所有的值互不相同,这样会导致某些集合操作会出现问题。 不过,如果你硬要在值上面执行这些集合操作的话,你可以先将值集合转换成 set,然后再执行集合运算就行了。 往期回顾: python问答学堂-《python进阶大全》中你必须掌握的QA 【python问答学堂】2期解压序列赋值给多个变量? 【python问答学堂】3解压可迭代对象赋值给多个变量? 【python问答学堂】4期保留最后 N 个元素? 【python问答学堂】5期 查找最大或最小的 N 个元素 【python问答学堂】6期 实现一个优先级队列 【python问答学堂】7期 字典中的键映射多个值 【python问答学堂】8期 字典排序 【python问答学堂】9期 字典的运算

剑曼红尘 2020-04-30 13:00:33 0 浏览量 回答数 0

回答

安装IronPython 到http://ironpython.codeplex.com/下载IronPython。 安装下载下来的安装包(要先装VS啊Smile)。 创建项目 创建一个C#的控制台应用程序。 添加引用: 浏览到IronPython的安装目录中,添加对IronPython.dll,Microsoft.Scripting.dll 两个dll的引用。 python1 添加Python文件到当前的项目中 创建一个文本文件命名为:hello.py, 编辑如下 def welcome(name): return "hello" + name 把该文件添加的当前的项目中。 python2 在C#中调用Python方法 python3 首先添加两个引用:它们定义了Python和ScriptRuntime两个类型。 第一句代码创建了一个Python的运行环境,第二句则使用.net4.0的语法创建了一个动态的对象, OK,下面就可以用这个dynamic类型的对象去调用刚才在定义的welcome方法了。 注意:在运行前一定要把hello.py文件设为:Copy always. python4 否则运行时会报找不到hello.py文件,enjoy it!

xuning715 2019-12-02 01:10:33 0 浏览量 回答数 0

问题

【python问答学堂】14期 通过某个关键字排序一个字典列表

剑曼红尘 2020-05-09 21:06:21 0 浏览量 回答数 0

回答

可以说 Python 没有赋值,只有引用。你这样相当于创建了一个引用自身的结构,所以导致了无限循环。为了理解这个问题,有个基本概念需要搞清楚。 Python 没有「变量」,我们平时所说的变量其实只是「标签」,是引用。 执行:values=[0,1,2]的时候,python做的事情是首先创建一个列表对象[0,1,2],然后给它贴上名为values的标签。如果随后执行values=[3,4,5] 的话,python做的事情是创建另一个列表对象[3,4,5],然后把刚才那张名为values的标签从前面的[0,1,2]对象上撕下来,重新贴到[3,4,5]这个对象上。

游客h2jwb5k5qe2pa 2020-03-11 11:23:31 0 浏览量 回答数 0

回答

1、凡是可应用于for循环的对象都是可迭代(可循环)(Iterable)对象,例如字符串、列表、元组、字典、集合等;2、凡是可应用于next()方法的对象都是迭代器(Iterator)对象,迭代器(Iterator)是一个惰性计算的过程,只有在需要返回下一个数值的时候才会被计算(这一过程跟生成器很像,都是用到一个数值调用一次。);3、迭代器一定是可迭代对象,但可迭代对象不一定损失迭代器(因为可能没有next()方法);4、可通过iter()这个内置函数,将可迭代对象转换为迭代器;5、python中很多底层的东西都是用迭代器封装的(python3.x中的for循环本身,就是用next()方法封装的);6、迭代器在python基础中是一个很重要的概念,一定要理解。

元芳啊 2019-12-02 01:04:34 0 浏览量 回答数 0

回答

1,线程(Thread) 使用多线程可以有效的利用CPU资源(Python例外)。然而多线程所带来的程序的复杂度也不可避免,尤其是对竞争资源的同步问题。 然而在python中由于使用了全局解释锁(GIL)的原因,代码并不能同时在多核上并发的运行,也就是说,Python的多线程不能并发,使用多线程来改进自己的Python代码后,程序的运行效率却下降了。 实际上使用多线程的编程模型是很困难的,程序员很容易犯错,这并不是程序员的错误,因为并行思维是反人类的,我们大多数人的思维是串行,而且冯诺依曼设计的计算机架构也是以顺序执行为基础的。所以如果你总是不能把你的多线程程序搞定。 Python提供两组线程的接口:一是thread模块,提供基础的,低等级(Low Level)接口,使用Function作为线程的运行体。还有一组是threading模块,提供更容易使用的基于对象的接口(类似于Java),可以继承Thread对象来实现线程,还提供了其它一些线程相关的对象。例如Timer,Lock : 使用thread模块的例子: import threaddef worker(): """thread worker function""" print 'Worker' thread.start_new_thread(worker) 使用threading模块的例子: import threadingdef worker(): """thread worker function""" print 'Worker' t = threading.Thread(target=worker)t.start() 2,进程 (Process) 由于前文提到的全局解释锁的问题,Python下比较好的并行方式是使用多进程,这样可以非常有效的使用CPU资源,并实现真正意义上的并发。当然,进程的开销比线程要大,也就是说如果你要创建数量惊人的并发进程的话,需要考虑一下你的机器是不是有一颗强大的心。 Python的mutliprocess模块和threading具有类似的接口。 from multiprocessing import Process def worker(): """thread worker function""" print 'Worker' p = Process(target=worker)p.start()p.join() 由于线程共享相同的地址空间和内存,所以线程之间的通信是非常容易的,然而进程之间的通信就要复杂一些了。常见的进程间通信有: 管道,消息队列,Socket接口(TCP/IP)等等Python的mutliprocess模块提供了封装好的管道和队列,可以方便的在进程间传递消息。 Python进程间的同步使用锁,这一点和线程是一样的。 另外,Python还提供了进程池Pool对象,可以方便的管理和控制线程。 3,远程分布式主机 (Distributed Node) 随着大数据时代的到临,数据的计算和处理需要分布式的计算机网络来运行,程序并行的运行在多个主机节点上,已经是现在的软件架构所必需考虑的问题。 远程主机间的进程间通信有几种常见的方式 TCP/IP TCP/IP是所有远程通信的基础,然而API比较低级别,使用起来比较繁琐,所以一般不会考虑 ; 远程方法调用 Remote Function Call RPC是早期的远程进程间通信的手段。Python下有一个开源的实现RPyC ; 远程对象 Remote Object 远程对象是更高级别的封装,程序可以想操作本地对象一样去操作一个远程对象在本地的代理。

元芳啊 2019-12-02 01:09:33 0 浏览量 回答数 0

问题

【python问答学堂】12期 命令切片

剑曼红尘 2020-05-07 14:54:22 3 浏览量 回答数 1

问题

【python问答学堂】11期 删除序列相同元素并保持顺序

剑曼红尘 2020-05-06 14:31:19 0 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站