• 关于 python 元类 的搜索结果

回答

print 在 Python3 中是函数必须加括号,Python2 中 print 为 class。 Python2 中使用 xrange,Python3 使用 range。 Python2 中默认的字符串类型默认是 ASCII,Python3 中默认的字符串类型是 Unicode。 Python2 中/的结果是整型,Python3 中是浮点类型。 Python2 中声明元类:metaclass = MetaClass,Python3 中声明元类:class newclass(metaclass=MetaClass):pass。

珍宝珠 2019-12-02 03:12:53 0 浏览量 回答数 0

回答

元类是类的类。类定义了类的实例(即对象)的行为,而元类定义了类的行为方式。类是元类的实例。 虽然在Python中你可以为元类使用任意的callables(比如Jerub节目),但更好的方法是让它成为一个真正的类本身。type是Python中常用的元类。type它本身就是一个类,它是它自己的类型。你将无法type在Python中重新创建纯粹的东西,但是Python会有所作为。要在Python中创建自己的元类,你真的只想要子类type。 元类最常用作类工厂。当您通过调用类创建对象时,Python通过调用元类创建一个新类(当它执行'class'语句时)。结合法线__init__和__new__方法,元类因此允许您在创建类时执行“额外的事情”,例如使用某些注册表注册新类或者完全替换其他类。 当class被执行的语句,Python的首先执行的主体class声明为代码的正常块。生成的命名空间(dict)保存了将要进行的类的属性。元类是通过查看待定类的基类(继承的元类),在待定类的__metaclass__属性(如果有)或__metaclass__全局变量来确定的。然后使用类的名称,基数和属性调用元类来实例化它。 但是,元类实际上定义了类的类型,而不仅仅是它的工厂,所以你可以用它们做更多的事情。例如,您可以在元类上定义常规方法。这些元类方法就像类方法一样,它们可以在没有实例的类上调用,但它们也不像类方法,因为它们不能在类的实例上调用。type.subclasses()是type元类的方法示例。您还可以定义常规的“魔术”方法,例如__add__,__iter__以及__getattr__实现或更改类的行为方式。

游客gsy3rkgcdl27k 2019-12-02 02:12:08 0 浏览量 回答数 0

回答

首先谈一点,为什么要在Android平台使用Python?Python拥有众多强大的第三方库和框架,在机器学习、大数据处理等诸多方面都有不俗的应用。另外,就语法而言,Python比Java更加简洁,同时又功能强大,既可面向过程亦可面向对象,而不像Java一样,是一种纯粹的面向对象语言,哪怕打印一句话也需要先创建类。Python作为一种脚本语言,可以边解释边执行,而不需编译,另外Python中存在的元类,可以使我们动态的创建类,如此可以在不需要重新编译安装apk的情况下,动态的由远程服务端为Android项目添加功能。我们还可以将Python已有的一些东西移植到Android平台,例如tornado、django等,总之玩法多多。 首先谈一点,为什么要在Android平台使用Python?Python拥有众多强大的第三方库和框架,在机器学习、大数据处理等诸多方面都有不俗的应用。另外,就语法而言,Python比Java更加简洁,同时又功能强大,既可面向过程亦可面向对象,而不像Java一样,是一种纯粹的面向对象语言,哪怕打印一句话也需要先创建类。Python作为一种脚本语言,可以边解释边执行,而不需编译,另外Python中存在的元类,可以使我们动态的创建类,如此可以在不需要重新编译安装apk的情况下,动态的由远程服务端为Android项目添加功能。我们还可以将Python已有的一些东西移植到Android平台,例如tornado、django等,总之玩法多多。

寒喵 2019-12-02 01:08:46 0 浏览量 回答数 0

新用户福利专场,云服务器ECS低至96.9元/年

新用户福利专场,云服务器ECS低至96.9元/年

问题

映射名称到序列元素【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学习全家桶】263道python热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:21 7217 浏览量 回答数 2

回答

lambda就python看人匿名函数,即无需去用def关键字定义 lambda x: x+1 lambda 参数: 表达式 另外python中还有一个type()元类,也有相当于lambda功能,只不过type是定义类。

天枢2020 2020-04-19 12:07:25 0 浏览量 回答数 0

回答

许多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在2008年引入二进制字面值。现在C++14也有了。【更新:Thiago Macieira在评论中指出,GCC实际上早在2007年就已经支持了。】`1 static const int primes = 0b10100000100010100010100010101100;`Python早在1998年引入了 原始字符串字面值。在硬编码正则表达式或Windows路径时很方便。 C++11也添加了同样的特性,只是语法上略有不同:`1 const char* path = R"(c:thisstringhasbackslashes)";`基于范围的For循环(Range-Based For Loops)在Python中,for循环总是迭代遍历一个Python对象: 1for x in myList: 2 print(x) 与此同时,在近30年里。C++仅支持C风格for循环。最后,在C++11中, 基于范围的for循环被添加进去。C++ 1for (int x : myList) 2 std::cout << x; 与Python迭代协议不同,你可以迭代一个 std::vector 或任何实现了begin和end成员函数的类。有了基于范围的for循环后,我经常发现自己希望C++能内建像Python的xrange函数一样的函数。自动化Python一直以来都是一个动态类型语言。你不需要声明变量类型,因为类型是对象本身的属性。`1x = "Hello world!"print(x)`从另一方面来说,C++不是动态类型语言。是静态类型。不过在C++11中将 auto 关键字 改作他用以用于类型推导,你能够写 看起来很像动态类型的代码:C++ 1 auto x = "Hello world!"; 2 std::cout << x; 当你调用重载几个类型的函数时,比如 std::ostream::operator<< 或者一个模板函数,C++更像一个动态类型语言。C++14进一步充实以支持auto关键字,为auto添加了 返回值支持和lambda函数 参数支持。元组 Python从一开始就很好的定义了元组类型。当你需要把几个值整合在一起的时候,元组就非常适合,这样就再不需要命名类来实现同样的功能了。 triple = (5, 6, 7) print(triple[0]) C++在C++11标准库中添加了对元组的支持。C++11的建议书 甚至还提到了这么做是受Python启发的:C++ auto triple = std::make_tuple(5, 6, 7); std::cout << std::get<0>(triple); Pyton允许你把一个元组解析为多个独立的变量:`x, y, z = triple`在C++里,你可以使用std::tie实现同样的功能:C++`std::tie(x, y, z) = triple;`统一的初始化 在Python里,列表是内置类型。因此,你可以只使用一个表达式来创建Python列表: myList = [6, 3, 7, 8] myList.append(5); C++的向量(std::vector)与Python的列表最为相似。如今,C++11里新增的 统一的初始化可以让我们只使用一个表达式来创建向量和列表了:C++ auto myList = std::vector<int>{ 6, 3, 7, 8 }; myList.push_back(5); 在Python里,你还可以只使用一个表达式来创建一个 字典: myDict = {5: "foo", 6: "bar"} print(myDict[5]) 与此类似,统一的初始化也适用于有序映射(std::map)和无序映射(unordered_map):C++ auto myDict = std::unordered_map<int, const char*>{ { 5, "foo" }, { 6, "bar" } }; std::cout << myDict[5]; Lambda表达式 Python从1994年开始支持lambda函数。`1 myList.sort(key = lambda x: abs(x))`Lambda表达式是在C++11中被添加进去。`1std::sort(myList.begin(), myList.end(), [](int x, int y){ return std::abs(x) < std::abs(y); });`2001年,Python添加了 静态嵌套作用域,可以让lambda函数抓取定义在封闭函数内的变量。 1def adder(amount): return lambda x: x + amount 2print(adder(5)(5)) 同样,C++ lambda表达式支持一堆灵活的 抓取规则,可以让你做相似的事情: auto adder(int amount) { return [=](int x){ return x + amount; }; } std::cout << adder(5)(5); 标准算法Python内建 filter 函数可以让你有选择的从一个列表中拷贝项(虽然列表解析是首先):`1result = filter(lambda x: x >= 0, myList)`C++11中 引入了 std::copy_if ,让你可以使用一个类似的、相当功能的类型: auto result = std::vector<int>{}; std::copy_if(myList.begin(), myList.end(), std::back_inserter(result), [](int x){ return x >= 0; }); 其他的C++ 算法模仿了Python的内建函数包括 transform、 any_of、 all_of, min 以及 max。即将到来的 范围提案有潜力进一步简化这些表达式。 参数打包Python 从 1988 年就开始支持任意长度的参数列表. 你可以定义一个函数接受任意数量的实参,Python 会将他们放到一个元组(tuple)中, 你还可以将这个元组重新展开为一个实参列表,并把他们传递进另一个函数: def foo(*args): return tuple(*args) ... triple = foo(5, 6, 7) C++11 引入了对 参数包(parameter packs) 的支持. 它类似于 Python 的任意长度参数列表,而不同于 C 风格的可变参数列表, 这个参数包有自己的标识符来表示整个实参序列。关键区别在于:在 C++ 中,这个参数包不能在运行时做为一个单独的对象来操作。你只能通过模板元编程技术在编译时来操纵他们。 template <typename... T> auto foo(T&&... args) { return std::make_tuple(args...); } ...auto triple = foo(5, 6, 7); 并非所有的 C++ 11 和 14 中的特性都借鉴于 Python。只是其中很大一部分特性看似如此。 Python 被认为是一种对使用者亲近友好的编程语言。随着时间的推移以及这些特性逐渐被其他语言借鉴,它其中一些特质也逐渐暗淡下来。

a123456678 2019-12-02 01:56:27 0 浏览量 回答数 0

问题

Python-SDK 之如何实现安装?

青衫无名 2019-12-01 21:40:53 2962 浏览量 回答数 0

问题

【精品问答】python技术1000问(1)

问问小秘 2019-12-01 21:57:48 448858 浏览量 回答数 12

回答

Python 变量类型变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。 变量赋值Python 中的变量赋值不需要类型声明。每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。等号(=)用来给变量赋值。等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- counter = 100 # 赋值整型变量miles = 1000.0 # 浮点型name = "John" # 字符串 print counterprint milesprint name 运行实例 »以上实例中,100,1000.0和"John"分别赋值给counter,miles,name变量。执行以上程序会输出如下结果:1001000.0John多个变量赋值Python允许你同时为多个变量赋值。例如:a = b = c = 1以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上。您也可以为多个对象指定多个变量。例如:a, b, c = 1, 2, "john"以上实例,两个整型对象1和2的分配给变量 a 和 b,字符串对象 "john" 分配给变量 c。 标准数据类型在内存中存储的数据可以有多种类型。例如,一个人的年龄可以用数字来存储,他的名字可以用字符来存储。Python 定义了一些标准类型,用于存储各种类型的数据。Python有五个标准的数据类型:Numbers(数字)String(字符串)List(列表)Tuple(元组)Dictionary(字典) Python数字数字数据类型用于存储数值。他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。当你指定一个值时,Number对象就会被创建:var1 = 1var2 = 10您也可以使用del语句删除一些对象的引用。del语句的语法是:del var1[,var2[,var3[....,varN]]]]您可以通过使用del语句删除单个或多个对象的引用。例如:del vardel var_a, var_bPython支持四种不同的数字类型:int(有符号整型)long(长整型[也可以代表八进制和十六进制])float(浮点型)complex(复数)实例一些数值类型的实例:int long float complex10 51924361L 0.0 3.14j100 -0x19323L 15.20 45.j-786 0122L -21.9 9.322e-36j080 0xDEFABCECBDAECBFBAEl 32.3e+18 .876j-0490 535633629843L -90. -.6545+0J-0x260 -052318172735L -32.54e100 3e+26J0x69 -4721885298529L 70.2E-12 4.53e-7j长整型也可以使用小写 l,但是还是建议您使用大写 L,避免与数字 1 混淆。Python使用 L 来显示长整型。Python 还支持复数,复数由实数部分和虚数部分构成,可以用 a + bj,或者 complex(a,b) 表示, 复数的实部 a 和虚部 b 都是浮点型。 Python字符串字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 :s="a1a2···an"(n>=0)它是编程语言中表示文本的数据类型。python的字串列表有2种取值顺序:从左到右索引默认0开始的,最大范围是字符串长度少1从右到左索引默认-1开始的,最大范围是字符串开头如果你要实现从字符串中获取一段子字符串的话,可以使用变量 [头下标:尾下标],就可以截取相应的字符串,其中下标是从 0 开始算起,可以是正数或负数,下标可以为空表示取到头或尾。比如:s = 'ilovepython's[1:5]的结果是love。当使用以冒号分隔的字符串,python返回一个新的对象,结果包含了以这对偏移标识的连续的内容,左边的开始是包含了下边界。上面的结果包含了s[1]的值l,而取到的最大范围不包括上边界,就是s[5]的值p。加号(+)是字符串连接运算符,星号(*)是重复操作。如下实例:实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- str = 'Hello World!' print str # 输出完整字符串print str[0] # 输出字符串中的第一个字符print str[2:5] # 输出字符串中第三个至第五个之间的字符串print str[2:] # 输出从第三个字符开始的字符串print str * 2 # 输出字符串两次print str + "TEST" # 输出连接的字符串以上实例输出结果:Hello World!Hllollo World!Hello World!Hello World!Hello World!TESTPython列表List(列表) 是 Python 中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(即嵌套)。列表用 [ ] 标识,是 python 最通用的复合数据类型。列表中值的切割也可以用到变量 [头下标:尾下标] ,就可以截取相应的列表,从左到右索引默认 0 开始,从右到左索引默认 -1 开始,下标可以为空表示取到头或尾。加号 + 是列表连接运算符,星号 * 是重复操作。如下实例:实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- list = [ 'runoob', 786 , 2.23, 'john', 70.2 ]tinylist = [123, 'john'] print list # 输出完整列表print list[0] # 输出列表的第一个元素print list[1:3] # 输出第二个至第三个元素 print list[2:] # 输出从第三个开始至列表末尾的所有元素print tinylist * 2 # 输出列表两次print list + tinylist # 打印组合的列表以上实例输出结果:['runoob', 786, 2.23, 'john', 70.2]runoob[786, 2.23][2.23, 'john', 70.2][123, 'john', 123, 'john']['runoob', 786, 2.23, 'john', 70.2, 123, 'john']Python元组元组是另一个数据类型,类似于List(列表)。元组用"()"标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 )tinytuple = (123, 'john') print tuple # 输出完整元组print tuple[0] # 输出元组的第一个元素print tuple[1:3] # 输出第二个至第三个的元素 print tuple[2:] # 输出从第三个开始至列表末尾的所有元素print tinytuple * 2 # 输出元组两次print tuple + tinytuple # 打印组合的元组以上实例输出结果:('runoob', 786, 2.23, 'john', 70.2)runoob(786, 2.23)(2.23, 'john', 70.2)(123, 'john', 123, 'john')('runoob', 786, 2.23, 'john', 70.2, 123, 'john')以下是元组无效的,因为元组是不允许更新的。而列表是允许更新的:实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 )list = [ 'runoob', 786 , 2.23, 'john', 70.2 ]tuple[2] = 1000 # 元组中是非法应用list[2] = 1000 # 列表中是合法应用 Python 字典字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。字典用"{ }"标识。字典由索引(key)和它对应的值value组成。实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- dict = {}dict['one'] = "This is one"dict[2] = "This is two" tinydict = {'name': 'john','code':6734, 'dept': 'sales'} print dict['one'] # 输出键为'one' 的值print dict[2] # 输出键为 2 的值print tinydict # 输出完整的字典print tinydict.keys() # 输出所有键print tinydict.values() # 输出所有值输出结果为:This is oneThis is two{'dept': 'sales', 'code': 6734, 'name': 'john'}['dept', 'code', 'name']['sales', 6734, 'john']Python数据类型转换有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可。以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。函数 描述int(x [,base])将x转换为一个整数long(x [,base] )将x转换为一个长整数float(x)将x转换到一个浮点数complex(real [,imag])创建一个复数str(x)将对象 x 转换为字符串repr(x)将对象 x 转换为表达式字符串eval(str)用来计算在字符串中的有效Python表达式,并返回一个对象tuple(s)将序列 s 转换为一个元组list(s)将序列 s 转换为一个列表set(s)转换为可变集合dict(d)创建一个字典。d 必须是一个序列 (key,value)元组。frozenset(s)转换为不可变集合chr(x)将一个整数转换为一个字符unichr(x)将一个整数转换为Unicode字符ord(x)将一个字符转换为它的整数值hex(x)将一个整数转换为一个十六进制字符串oct(x)将一个整数转换为一个八进制字符串

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

问题

什么是Python中的元类?

游客6qcs5bpxssri2 2019-12-01 19:55:40 15 浏览量 回答数 2

回答

懒婆娘的裹脚布######回复 @Xsank : 不用跟这种满嘴粗话、妄下结论的人浪费时间######也许你是个大牛,但是这样评论一点意义都没有,这是个技术论坛,不是给你撒泼的######排版不行 看着难受, 这个好神奇 . 看不懂 谁给解释下 或者说下查Python文档应该用哪个关键词? ######你搜下python元类的相关资料吧,这个算是元类的一个应用###### 我没有记错的情况下,Python 3 中有re这个模块!为什么不考虑考虑用正则!用正则来验证长度和字符。 ######re这个模块python2.x就有,这里主要是为了说明一种插件模式的使用方法######菜鸟路过######写的不错,不过排版怎么是这样,字符都连到一起去了######重新编辑了一下###### 有待改进 PluginMount这个类可用一个list替代 创建了Plugin对象只调用一次validate方法,有点多余 可参考Django的内部验证机制 https://github.com/django/django/blob/master/django/forms/fields.py ######最近正准备学习下django源码,多谢指点###### 插件在需要的时候再用,你可以在任何地方都用插件,任何过程,任何参数都可以用上插件,问题是这是不是你要面对的变化,或者就算遇到变化改一两行就可以了? 建议先把东西做出来,再看哪里需要插件。如果一开始就规划插件,挺浪费时间的,除非这个业务你非常清晰,你知道你做的是有用的。 ######我觉得, 这个用Python的继承/多重继承会比较方便. 对于一个密码验证来说, __metaclass__黑魔法感略重. (仅说说, 还没认真思考)

kun坤 2020-06-08 09:45:47 0 浏览量 回答数 0

问题

【python问答学堂】6期 实现一个优先级队列

剑曼红尘 2020-04-26 12:54:04 64 浏览量 回答数 2

回答

type在python中主要两个功能: 1.type()类型 2.元类,即动态创建类,类型于匿名函数用法。

天枢2020 2020-03-31 10:39:07 0 浏览量 回答数 0

回答

python有lambda匿名函数。 还有type元类。

游客aasf2nc2ujisi 2019-12-02 03:10:15 0 浏览量 回答数 0

问题

注册元编程类

kun坤 2019-12-25 21:47:44 3 浏览量 回答数 1

回答

"懒婆娘的裹脚布######回复 <a href=""http://my.oschina.net/xsank"" class=""referer"" target=""_blank"">@Xsank : 不用跟这种满嘴粗话、妄下结论的人浪费时间######也许你是个大牛,但是这样评论一点意义都没有,这是个技术论坛,不是给你撒泼的######排版不行 看着难受, 这个好神奇 . 看不懂 谁给解释下 或者说下查Python文档应该用哪个关键词? ######你搜下python元类的相关资料吧,这个算是元类的一个应用###### 我没有记错的情况下,Python 3 中有re这个模块!为什么不考虑考虑用正则!用正则来验证长度和字符。 ######re这个模块python2.x就有,这里主要是为了说明一种插件模式的使用方法######菜鸟路过######写的不错,不过排版怎么是这样,字符都连到一起去了######重新编辑了一下###### 有待改进 PluginMount这个类可用一个list替代 创建了Plugin对象只调用一次validate方法,有点多余 可参考Django的内部验证机制 https://github.com/django/django/blob/master/django/forms/fields.py ######最近正准备学习下django源码,多谢指点###### 插件在需要的时候再用,你可以在任何地方都用插件,任何过程,任何参数都可以用上插件,问题是这是不是你要面对的变化,或者就算遇到变化改一两行就可以了? 建议先把东西做出来,再看哪里需要插件。如果一开始就规划插件,挺浪费时间的,除非这个业务你非常清晰,你知道你做的是有用的。 ######我觉得, 这个用Python的继承/多重继承会比较方便. 对于一个密码验证来说, __metaclass__黑魔法感略重. (仅说说, 还没认真思考)"

montos 2020-06-04 14:28:13 0 浏览量 回答数 0

回答

类 StructTupleMeta 获取到类属性 _fields 中的属性名字列表, 然后将它们转换成相应的可访问特定元组槽的方法。函数 operator.itemgetter() 创建一个访问器函数, 然后 property() 函数将其转换成一个属性。 本节最难懂的部分是知道不同的初始化步骤是什么时候发生的。 StructTupleMeta 中的 init() 方法只在每个类被定义时被调用一次。 cls 参数就是那个被定义的类。实际上,上述代码使用了 _fields 类变量来保存新的被定义的类, 然后给它再添加一点新的东西。 StructTuple 类作为一个普通的基类,供其他使用者来继承。 这个类中的 new() 方法用来构造新的实例。 这里使用 new() 并不是很常见,主要是因为我们要修改元组的调用签名, 使得我们可以像普通的实例调用那样创建实例。就像下面这样: s = Stock('ACME', 50, 91.1) # OK s = Stock(('ACME', 50, 91.1)) # Error 跟 init() 不同的是,new() 方法在实例被创建之前被触发。 由于元组是不可修改的,所以一旦它们被创建了就不可能对它做任何改变。而 init() 会在实例创建的最后被触发, 这样的话我们就可以做我们想做的了。这也是为什么 new() 方法已经被定义了。 尽管本节很短,还是需要你能仔细研读,深入思考Python类是如何被定义的,实例是如何被创建的, 还有就是元类和类的各个不同的方法究竟在什么时候被调用。 PEP 422 提供了一个解决本节问题的另外一种方法。 但是,截止到我写这本书的时候,它还没被采纳和接受。 尽管如此,如果你使用的是Python 3.3或更高的版本,那么还是值得去看一下的。

景凌凯 2020-04-17 17:37:11 0 浏览量 回答数 0

回答

"懒婆娘的裹脚布######回复 <a href=""http://my.oschina.net/xsank"" class=""referer"" target=""_blank"">@Xsank : 不用跟这种满嘴粗话、妄下结论的人浪费时间######也许你是个大牛,但是这样评论一点意义都没有,这是个技术论坛,不是给你撒泼的######排版不行 看着难受, 这个好神奇 . 看不懂 谁给解释下 或者说下查Python文档应该用哪个关键词? ######你搜下python元类的相关资料吧,这个算是元类的一个应用###### 我没有记错的情况下,Python 3 中有re这个模块!为什么不考虑考虑用正则!用正则来验证长度和字符。 ######re这个模块python2.x就有,这里主要是为了说明一种插件模式的使用方法######菜鸟路过######写的不错,不过排版怎么是这样,字符都连到一起去了######重新编辑了一下###### 有待改进 PluginMount这个类可用一个list替代 创建了Plugin对象只调用一次validate方法,有点多余 可参考Django的内部验证机制 https://github.com/django/django/blob/master/django/forms/fields.py ######最近正准备学习下django源码,多谢指点###### 插件在需要的时候再用,你可以在任何地方都用插件,任何过程,任何参数都可以用上插件,问题是这是不是你要面对的变化,或者就算遇到变化改一两行就可以了? 建议先把东西做出来,再看哪里需要插件。如果一开始就规划插件,挺浪费时间的,除非这个业务你非常清晰,你知道你做的是有用的。 ######我觉得, 这个用Python的继承/多重继承会比较方便. 对于一个密码验证来说, __metaclass__黑魔法感略重. (仅说说, 还没认真思考)" ![image.png](https://ucc.alicdn.com/pic/developer-ecology/e31bc95bc55b48e983a9cc28dc5c5daf.png)

python小菜菜 2020-05-27 15:37:24 0 浏览量 回答数 0

问题

Python基础测验(答案篇)

珍宝珠 2019-12-01 22:02:53 603 浏览量 回答数 1

回答

问题 怎样实现一个按优先级排序的队列? 并且在这个队列上面每次 pop 操作总是返回优先级最高的那个元素 解决方案 下面的类利用 heapq 模块实现了一个简单的优先级队列: 仔细观察可以发现,第一个 pop() 操作返回优先级最高的元素。 另外注意到如果两个有着相同优先级的元素( foo 和 grok ),pop 操作按照它们被插入到队列的顺序返回的。 讨论 这一小节我们主要关注 heapq 模块的使用。 函数 heapq.heappush() 和 heapq.heappop() 分别在队列 _queue 上插入和删除第一个元素, 并且队列 _queue 保证第一个元素拥有最高优先级( 1.4 节已经讨论过这个问题)。 heappop() 函数总是返回”最小的”的元素,这就是保证队列pop操作返回正确元素的关键。 另外,由于 push 和 pop 操作时间复杂度为 O(log N),其中 N 是堆的大小,因此就算是 N 很大的时候它们运行速度也依旧很快。 在上面代码中,队列包含了一个 (-priority, index, item) 的元组。 优先级为负数的目的是使得元素按照优先级从高到低排序。 这个跟普通的按优先级从低到高排序的堆排序恰巧相反。 index 变量的作用是保证同等优先级元素的正确排序。 通过保存一个不断增加的 index 下标变量,可以确保元素按照它们插入的顺序排序。 而且, index 变量也在相同优先级元素比较的时候起到重要作用。 为了阐明这些,先假定 Item 实例是不支持排序的: 如果你想在多个线程中使用同一个队列,那么你需要增加适当的锁和信号量机制。 可以查看 12.3 小节的例子演示是怎样做的。 往期回顾: python问答学堂-《python进阶大全》中你必须掌握的QA 【python问答学堂】2期解压序列赋值给多个变量? 【python问答学堂】3解压可迭代对象赋值给多个变量? 【python问答学堂】4期保留最后 N 个元素? 【python问答学堂】5期 查找最大或最小的 N 个元素

剑曼红尘 2020-04-26 12:54:12 0 浏览量 回答数 0

回答

序列:在python中,最基本的数据结构是序列(sequence)。序列中的每个元素被分配一个序号——即元素的位置,也成为索引。序列分类:python包括6中内建的序列,最常用的的两种类型是:序列和元组。其他的序列有字符串、Unicode字符串、buffer对象和xrange对象。其中,列表和元组的主要区别在于:列表是可以被修改的,而元组则不可以。希望我的答案能够帮助到你,答案满意还请采纳,谢谢。

大财主 2019-12-02 01:05:56 0 浏览量 回答数 0

回答

补充楼下: python类型两大类:可变类型和不可变类型 可变类型:列表,字典,集合 不可变类型:字符串,元组,数字类型 元组不可变类型。 元组确实是用圆括号。但是要注意。 (123) 这不是元组 (123,) 这个才是元组。一个元gxi时候要带逗号。

游客aasf2nc2ujisi 2019-12-02 03:10:47 0 浏览量 回答数 0

回答

在这个信息时代高速发展的情况下,很多人会对自己该往哪个方向发展感到迷茫,下面我就浅显的给大家介绍一下五大流行区域的发展前景。大数据的发展前景:当前大数据行业真的是人才稀缺吗?学了几年后,大数据行业会不会产能过剩?大数据行业最终需要什么样的人才?接下来就带你们看看分析结果:当前大数据行业真的是人才稀缺吗?对!未来人才缺口150万,数据分析人才最稀缺。先看大数据人才缺口有多大?根据LinkedIn(领英)发布的《2016年中国互联网最热职位人才报告》显示,研发工程师、产品经理、人力资源、市场营销、运营和数据分析是当下中国互联网行业需求最旺盛的六类人才职位。其中数据分析人才最为稀缺、供给指数最低。同时,数据分析人才跳槽速度也最快,平均跳槽速度为19.8个月。而清华大学计算机系教授武永卫去年透露了一组数据:未来3-5年,中国需要180万数据人才,但目前只有约30万人。大数据行业未来会产能过剩吗?提供大数据技术与应用服务的第三方公司面临调整,未来发展会趋集中关于“大数据概念是否被过度炒作”的讨论,其实2013年的夏季达沃斯就有过。彼时支持“炒作”观点的现场观众达54.5%。对此,持反对意见的北京大学光华管理学院副教授苏萌提出了三个理由:不同机构间的数据还未真正流动起来,目前还只是数据“孤岛”;完整的生态产业链还未形成,尽管通过行为数据分析已能够分辨出一个消费者的喜好,但从供应到购买的链条还没建成;数据分析人才仍然极度匮乏。4年之后,舆论热点已经逐渐从大数据转向人工智能,大数据行业也历经整合。近一年间,一些大数据公司相继出现裁员、业务大调整等情况,部分公司出现亏损。那都是什么公司面临危机呢?基于数据归属,涉及大数据业务的公司其实有两类:一类是自身拥有数据的甲方公司,如亚马逊、阿里巴巴等;另一类是整合数据资源,提供大数据技术与应用服务的第三方公司。目前行业整合出现盈利问题的公司多集中在第三方服务商。对此,LinkedIn(领英)中国技术副总裁王迪表示,第三方服务商提供的更多的是技术或平台,大数据更多还是让甲方公司获益。在王迪看来,大数据业务要产生规模效益,至少要具备三点:算法、计算平台以及数据本身。“第三方大数据创业公司在算法上有一技之长,而计算能力实际上已经匀化了,传统企业如果用好了,和大数据创业公司没有区别,甚至计算能力更强,而数据获取方面,很多数据在传统行业内部并没有共享出来,第三方大数据公司获取这些数据是比较困难的,最后可能谁有数据,谁产生的价值更高。”说白了,数据为王。在2013年,拿到千万级A轮融资的大数据企业不足10家,到2015年,拿到千万级以上A轮融资的企业已经超过30家。直到2016年互联网资本寒冬,大数据行业投资热度有所减退,大数据行业是否也存在产能过剩?王迪认为,目前的行业整合属于正常现象,“经过市场的优胜劣汰,第三方服务领域会出现一些做得比较好的公司,其他公司可能被淘汰或转型做一些垂直行业应用。从社会来看,总的需求量一定是增加的,而对于供给侧,经过行业自然的洗牌,最终会集中在几家优秀的行业公司。”需要什么样的大数据人才?今年3月份,教育部公布了第二批获准开设“数据科学与大数据技术”的高校名单,加上第一批获批的北京大学、对外经济贸易大学、中南大学,一共35所高校获批该专业。今年开始,部分院校将招收第一届大数据专业本科生。大数据人才培养涉及到两方面问题:交叉性学科的人才培养方案是否与市场需求相匹配;学科建设的周期与行业快速更新之间的差距怎样弥合。对于第一个问题,“电商热”时期开设的电子商务专业是一个可吸取经验的样本。2000年,教育部高教司批准了第一批高校开设电子商务本科专业。作为一个复合型专业,电子商务的本科教学涵盖了管理、技术、营销三方面的课程。电子商务领域人才需求量大,但企业却无法从电子商务专业中找到合适的人才,原因何在?职业规划专家姜萌认为,并不是某一个专业对应一个行业热点,而是一个专业集群对应一个行业热点。“比如电子商务专业,我们到电子商务公司里会发现,不是学电子商务的人在做这些工作,而是每个专业各司其职,比如计算机、设计、物流管理、营销、广告、金融等等。现在行业的复合型工作都是由一个专业集群来完成的,而不是一个人来复合一堆专业特点。”大数据专业的人才培养也同样走复合型路线,复旦大学大数据学院的招生简章显示,学院本科人才培养以统计学、计算机科学和数学为三大基础支撑性学科,以生物学、医学、环境科学、经济学、社会学、管理学等为应用拓展性学科,具备典型的交叉学科特征。LinkedIn(领英)中国技术副总裁王迪指出,“从企业应用的角度来看,大数据行业里从事相关职能的同学背景是各异的,大数据作为一个人才培养方向还在探索中,在这个阶段,高校尝试开设硕士课程是很好的实践,但开设一类的本科专业还为时过早。”另一方面,专业人才培养的周期较长,而行业热点不断更新轮替,中间产生的时间差使得新兴专业的志愿填报具备了一定风险。王迪认为,“从今天的产业实践上看,大数据领域依然是从现有专业中挑选人才,教育和市场发展总是有一定差距的,学生本科四年,加上硕士阶段已经是七年之后的事情了,产业已经演进了很多,而教学大纲并不会跟进得那么快。”因此,尽管大数据的应用前景毋庸置疑,但在人才培养层面,复合型人才培养方案会不会重走电子商务专业的老路?学校教育如何赶上行业发展速度?这些都是值得进一步商榷的问题。面对热门专业,志愿填报需要注意啥?了解了大数据行业、公司和大数据专业后,姜萌对于考生填报像大数据相关的热门专业,提出了几条建议:报考热的专业和就业热的专业并不一定是重合的,比如软件、计算机、金融,这些专业的就业率实际并没有那么高,地质勘探、石油、遥感等专业,虽然报考上是冷门,但行业需求大,就业率更高。选择热门专业,更需要考虑就业质量。专业就业好,是统计学意义,指的是平均收入水平高,比如金融专业的收入,比其他纯文科专业的平均收入较高,但落实到个体层面,就业情况就不一样了,尤其像金融专业是典型的名校高学历好就业,但对于考试成绩较低的同学来说,如果去一些普通院校、专科院校学习金融,最后就业情况可能还不如会计专业。志愿填报,除了专业,城市因素也很重要:如果想从事金融、互联网的工作,更适合去一线城市,如果是去三、四线城市的学生可以考虑应用面比较广的专业,就是各行各业都能用到的专业,比如会计专业,专科层次的会计和985层次的会计都有就业渠道。如果先选择报考城市,也可以针对所在城市的行业特点选择专业,比如沿海城市外贸相对发达,选择国际贸易、外语类专业就业情况更好,比如武汉有光谷,选择光电类专业更好就业。最终家长和考生更需要考虑个人与专业匹配的问题,金融、计算机等热门专业不是所有人都适合学,好专业不见得对所有个体都是好的。java的发展前景:由于Java的诸多优点,Java的发展前景十分广泛。比如,在我们中国的市场,Java无论在企业级应用,还是在面向大众的服务方面都取得了不少进展,在中国的电信、金融等关键性业务中发挥着举足轻重的作用。由于SUN、TBM、Oracle等国际厂商相继推出各种基于Java技术的应用服务器以及各种应用软件,推动了Java在金融、电信、制造等领域日益广泛的应用,如清华大学计算机系利用Java、XML和Web技术研制开发了多个软件平台,东方科技的TongWeb、中创的Inforweb等J2EE应用服务器。由此可见,在巨大市场需求下,企业对于Java人才的渴求已经是不争的事实。你问我火了这么多年的Java语言的发展前景怎么样?那来看看吧Java在WEB、移动设备以及云计算方面前景广阔,随着云计算以及移动领域的扩张,更多的企业在考虑将其应用部署在Java平台上。无论是本地主机,公共云,Java都是目前最适合的选择。;另外在Oracle的技术投资担保下,Java也是企业在云应用方面回避微软平台、在移动应用方面回避苹果公司的一个最佳选择。Java可以参与制作大部分网络应用程序系统,而且与如今流行的WWW浏览器结合很好,这一优点将促进Java的更大范围的推广。因为在未来的社会,信息将会传送的更加快速,这将推动程序向WEB程序方向发展,由于Java具有编写WEB程序的能力,并且Java与浏览器结合良好,这将使得Java前景充满光明的发展。Python的发展前景:Python程序员的发展前景是怎样的?随着Python的技术的流行, Python在为人们带来工作与生活上的便捷后,关注者们开始慢慢关心Python的发展前景与方向。从自身特性看Python发展Python自身强大的优势决定其不可限量的发展前景。Python作为一种通用语言,几乎可以用在任何领域和场合,角色几乎是无限的。Python具有简单、易学、免费、开源、可移植、可扩展、可嵌入、面向对象等优点,它的面向对象甚至比java和C#、.net更彻底。它是一种很灵活的语言,能帮你轻松完成编程工作。强大的类库支持,使编写文件处理、正则表达式,网络连接等程序变得相当容易。能运行在多种计算机平台和操作系统中,如各位unix,windows,MacOS,OS/2等等,并可作为一种原型开发语言,加快大型程序的开发速度。从企业应用来看Python发展Python被广泛的用在Web开发、运维自动化、测试自动化、数据挖掘等多个行业和领域。一项专业调查显示,75%的受访者将Python视为他们的主要开发语言,反之,其他25%受访者则将其视为辅助开发语言。将Python作为主要开发语言的开发者数量逐年递增,这表明Python正在成为越来越多开发者的开发语言选择。目前,国内不少大企业都已经使用Python如豆瓣、搜狐、金山、腾讯、盛大、网易、百度、阿里、淘宝、热酷、土豆、新浪、果壳等;国外的谷歌、NASA、YouTube、Facebook、工业光魔、红帽等都在应用Python完成各种各样的任务。从市场需求与薪资看Python发展Python得到越来越多公司的青睐,使得Python人才需求逐年增加,从市场整体需求来看,Python在招聘市场上的流行程度也是在逐步上升的,工资水平也是水涨船高。据统计Python平均薪资水平在12K,随着经验的提升,薪资也是逐年增长。学习Python的程序员,除去Python开发工程师、Python高级工程师、Python自动化测试外,也能够朝着Python游戏开发工程师、SEO工程师、Linux运维工程师等方向发展,发展方向较为多元化。随着Python的流行,带动的是它的普及以及市场需求量,所以现在学习Python是个不错的时机。区块链的发展前景:区块链开发 ? 155---0116---2665 ?可是区块链技术到底是什么,大多数人都是模糊没有概念。通俗来讲,如果我们把数据库假设成一本账本,读写数据库就可以看做一种记账的行为,区块链技术的原理就是在一段时间内找出记账最快最好的人,由这个人来记账,然后将账本的这一页信息发给整个系统里的其他所有人。区块链技术也称分布式账本(或账簿)技术,属于互联网数据库技术,由参与者共同完成数据库记录,特点是去中心化和公开透明。此外,在每个区块的信息写入并获得认可后,整个区块链数据库完整保存在互联网的节点中,难以被修改,因此数据库的安全性极高。人们普遍认为,区块链技术是实现数字产品(如货币和知识产权)快速、安全和透明地对等(P2P)转账或转让的重要手段。在以色列Zen Protocol公司,区块链应用软件开发专家阿希尔·曼宁介绍说,他们公司正在开发Zen区块链平台,其将用于支持金融产品在无中介的环境下自动和自由交易。通常,人们将钱存放在银行,依靠银行管理自己的资金。但是,在支配资金时往往会受到银行规定的限制,或在汇款时存在耗时长、费用高等问题。区块链技术平台将让人们首次拥有自己管理和支配钱财的能力,他相信去中心化金融管理体系具有广阔的市场,有望极大地改变传统的金融市场。2018年伊始这一轮区块链的热潮,主要起源于虚拟货币的炒作热情。站在风口,区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。很多人不禁要问“区块链又和比特币又是什么关系?”记者查询了大量资料发现,比特币2009年被一位名叫中本聪的人提出,之后比特币这套去中心化的机制一直稳定运行,这引起很多人对这套历史上并不存在的运行机制强烈关注。于是人们把从比特币技术抽象提取出来的技术运用于其他领域,称之为区块链。这过程就好像人们先发明了面条,然后人们发现其背后面粉不仅可以做面条还可以做馒头、面包。比特币是面条,区块链是面粉。也就是说,区块链和比特币的关系即比特币算是区块链技术的一种应用,或者说一种使用了区块链技术的产品形态。而说到区块链不得不说的就是ICO,它是一种公开发行的初始数字货币。对于投资人来说,出于对市场信号的敏感和长期关注价值投资项目,目前炙手可热的区块链也成为诸多投资人关注的新兴项目之一。“区块链对于我们来说就是省去了中间环节,节约了交易成本,节省了交易时间,但是目前来看各方面环境还不够成熟,有待观望。”一位投资人这样说道。记者发现,在春节期间,不少互金圈的朋友熬夜到凌晨进入某个探讨区块链的微信群热聊,此群还吸引了不少知名人士,诸如明星加入,同时还有大咖在群里解读区块链的投资方式和未来发展等等。一时间,关于区块链的讨论群接二连三出现,也引发了各个行业对区块链的关注。出于对于区块链技术懵懂的状态,记者追问了身边的一些互金圈的朋友,为何如此痴迷区块链?多数朋友认为“区块链能赚钱,抱着试试看的心态,或许能像之前比特币一样从中获取收益。”显然,区块链技术具有广阔的应用潜力,但是在其逐步进入社会改善民众生活的过程中,也面临许多的问题,需要积极去寻求相应的对策,最终让其发挥出潜力。只有这样,10年或20年后人们才能真正享受区块链技术创造的美好环境。人工智能的发展前景:人工智能产业是智能产业发展的核心,是其他智能科技产品发展的基础,国内外的高科技公司以及风险投资机构纷纷布局人工智能产业链。科技部部长万钢3月10日表示,加快实施新一代人工智能科学基础的关键技术系统集成研发,使那些研发成果尽快能够进入到开放平台,在开放使用中再一次把它增强完善。万钢称,马上就要发布人工智能项目指南和细则,来突破基础前沿理论关键部分的技术。人工智能发展趋势据前瞻产业研究院《人工智能行业市场前瞻与投资战略规划分析报告》指出,2017年中国人工智能核心产业规模超过700亿元,随着国家规划的出台,各地人工智能相关建设将逐步启动,预计到2020年,中国人工智能核心产业规模将超过1600亿元,增长率达到26.2%。报告认为,从产业投资回报率分析,智能安防、智能驾驶等领域的快速发展都将刺激计算机视觉分析类产品的需求,使得计算机视觉领域具备投资价值;而随着中国软件集成水平和人们生活水平的提高,提供教育、医疗、娱乐等专业化服务的服务机器人和智能无人设备具备投资价值。人工智能现状当前,人工智能受到的关注度持续提升,大量的社会资本和智力、数据资源的汇集驱动人工智能技术研究不断向前推进。从发展层次来看,人工智能技术可分为计算智能、感知智能和认知智能。当前,计算智能和感知智能的关键技术已经取得较大突破,弱人工智能应用条件基本成熟。但是,认知智能的算法尚未突破,前景仍不明朗。今年,随着智力资源的不断汇集,人工智能核心技术的研究重点可能将从深度学习转为认知计算,即推动弱人工智能向强人工智能不断迈进。一方面,在人工智能核心技术方面,在百度等大型科技公司和北京大学、清华大学等重点院校的共同推动下,以实现强人工智能为目标的类脑智能有望率先突破。另一方面,在人工智能支撑技术方面,量子计算、类脑芯片等核心技术正处在从科学实验向产业化应用的转变期,以数据资源汇集为主要方向的物联网技术将更加成熟,这些技术的突破都将有力推动人工智能核心技术的不断演进。工业大数据2022 年我国工业大数据有望突破 1200 亿元, 复合增速 42%。 工业大数据是提升制造智能化水平,推动中国制造业转型升级的关键动力,具体包括企业信息化数据、工业物联网数据,以及外部跨界数据。其中,企业信息化和工业物联网中机器产生的海量时序数据是工业数据的主要来源。工业大数据不仅可以优化现有业务,实现提质增效,而且还有望推动企业业务定位和盈利模式发生重大改变,向个性化定制、智能化生产、网络化协同、服务化延伸等智能化场景转型。预计到 2022 年,中国工业大数据市场规模有望突破 1200亿元,年复合增速 42%。IT的未来是人工智能这是一个指数级增长的时代。过去几十年,信息技术的进步相当程度上归功于芯片上晶体管数目的指数级增加,及由此带来的计算力的极大提升。这就是所谓的摩尔定律。在互联网时代,互联的终端数也是超线性的增长,而网络的效力大致与联网终端数的平方成正比。今天,大数据时代产生的数据正在呈指数级增加。在指数级增长的时代,我们可能会高估技术的短期效应,而低估技术的长期效应。历史的经验告诉我们,技术的影响力可能会远远的超过我们的想象。未来的计算能力人工智能需要强大的计算能力。计算机的性能过去30年提高了一百万倍。随着摩尔定律逐渐趋于物理极限,未来几年,我们期待一些新的技术突破。先谈一下类脑计算。传统计算机系统,长于逻辑运算,不擅长模式识别与形象思维。构建模仿人脑的类脑计算机芯片,我们今天可以以极低的功耗,模拟100万个神经元,2亿5千万个神经突触。未来几年,我们会看到类脑计算机的进一步的发展与应用随着互联网的普及、传感器的泛在、大数据的涌现、电子商务的发展、信息社区的兴起,数据和知识在人类社会、物理空间和信息空间之间交叉融合、相互作用,人工智能发展所处信息环境和数据基础发展了巨大的变化。伴随着科学基础和实现载体取得新的突破,类脑计算、深度学习、强化学习等一系列的技术萌芽预示着内在动力的成长,人工智能的发展已进入一个新的阶段。发展发展前景好,代表你现在学习会比后来者起步快,占有更大的优势,当然,你也要明白兴趣是最好的老师,选择自己感兴趣的相信你学的会更加而牢固。记住,最重要的一点:方向最重要!!!希望大家多多关注. ,加微信zhanglindashuju 可以获取更多资料哦作者:失色的瞳孔链接:https://juejin.im/post/5b1a6531e51d45067e6fc24a来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

孟志昂 2019-12-02 01:45:13 0 浏览量 回答数 0

问题

将Python复杂字符串输出(-0-0j)转换为等效的复杂字符串

kun坤 2019-12-26 10:52:45 0 浏览量 回答数 1

回答

Python常见数据结构整理 Python中常见的数据结构可以统称为容器(container)。序列(如列表和元组)、映射(如字典)以及集合(set)是三类主要的容器。 一、序列(列表、元组和字符串) 序列中的每个元素都有自己的编号。Python中有6种内建的序列。其中列表和元组是最常见的类型。其他包括字符串、Unicode字符串、buffer对象和xrange对象。下面重点介绍下列表、元组和字符串。 1、列表 列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。 (1)、创建 通过下面的方式即可创建一个列表: 1 2 3 4 list1=['hello','world'] print list1 list2=[1,2,3] print list2 输出: ['hello', 'world'] [1, 2, 3] 可以看到,这中创建方式非常类似于javascript中的数组。 (2)、list函数 通过list函数(其实list是一种类型而不是函数)对字符串创建列表非常有效: 1 2 list3=list("hello") print list3 输出: ['h', 'e', 'l', 'l', 'o'] 2、元组 元组与列表一样,也是一种序列,唯一不同的是元组不能被修改(字符串其实也有这种特点)。 (1)、创建 1 2 3 4 5 6 t1=1,2,3 t2="jeffreyzhao","cnblogs" t3=(1,2,3,4) t4=() t5=(1,) print t1,t2,t3,t4,t5 输出: (1, 2, 3) ('jeffreyzhao', 'cnblogs') (1, 2, 3, 4) () (1,) 从上面我们可以分析得出: a、逗号分隔一些值,元组自动创建完成; b、元组大部分时候是通过圆括号括起来的; c、空元组可以用没有包含内容的圆括号来表示; d、只含一个值的元组,必须加个逗号(,); (2)、tuple函数 tuple函数和序列的list函数几乎一样:以一个序列(注意是序列)作为参数并把它转换为元组。如果参数就算元组,那么该参数就会原样返回: 1 2 3 4 5 6 7 8 t1=tuple([1,2,3]) t2=tuple("jeff") t3=tuple((1,2,3)) print t1 print t2 print t3 t4=tuple(123) print t45 输出: (1, 2, 3) ('j', 'e', 'f', 'f') (1, 2, 3) Traceback (most recent call last): File "F:\Python\test.py", line 7, in <module> t4=tuple(123) TypeError: 'int' object is not iterable 3、字符串 (1)创建 1 2 3 4 5 str1='Hello world' print str1 print str1[0] for c in str1: print c 输出: Hello world H H e l l o w o r l d (2)格式化 字符串格式化使用字符串格式化操作符即百分号%来实现。 1 2 str1='Hello,%s' % 'world.' print str1 格式化操作符的右操作数可以是任何东西,如果是元组或者映射类型(如字典),那么字符串格式化将会有所不同。 1 2 3 4 5 6 strs=('Hello','world') #元组 str1='%s,%s' % strs print str1 d={'h':'Hello','w':'World'} #字典 str1='%(h)s,%(w)s' % d print str1 输出: Hello,world Hello,World 注意:如果需要转换的元组作为转换表达式的一部分存在,那么必须将它用圆括号括起来: 1 2 str1='%s,%s' % 'Hello','world' print str1 输出: Traceback (most recent call last): File "F:\Python\test.py", line 2, in <module> str1='%s,%s' % 'Hello','world' TypeError: not enough arguments for format string 如果需要输出%这个特殊字符,毫无疑问,我们会想到转义,但是Python中正确的处理方式如下: 1 2 str1='%s%%' % 100 print str1 输出:100% 对数字进行格式化处理,通常需要控制输出的宽度和精度: 1 2 3 4 5 6 7 from math import pi str1='%.2f' % pi #精度2 print str1 str1='%10f' % pi #字段宽10 print str1 str1='%10.2f' % pi #字段宽10,精度2 print str1 输出: 3.14 3.141593 3.14 字符串格式化还包含很多其他丰富的转换类型,可参考官方文档。 Python中在string模块还提供另外一种格式化值的方法:模板字符串。它的工作方式类似于很多UNIX Shell里的变量替换,如下所示: 1 2 3 4 from string import Template str1=Template('$x,$y!') str1=str1.substitute(x='Hello',y='world') print str1 输出: Hello,world! 如果替换字段是单词的一部分,那么参数名称就必须用括号括起来,从而准确指明结尾: 1 2 3 4 from string import Template str1=Template('Hello,w${x}d!') str1=str1.substitute(x='orl') print str1 输出: Hello,world! 如要输出符,可以使用$输出: 1 2 3 4 from string import Template str1=Template('$x$$') str1=str1.substitute(x='100') print str1 输出:100$ 除了关键字参数之外,模板字符串还可以使用字典变量提供键值对进行格式化: 1 2 3 4 5 from string import Template d={'h':'Hello','w':'world'} str1=Template('$h,$w!') str1=str1.substitute(d) print str1 输出: Hello,world! 除了格式化之外,Python字符串还内置了很多实用方法,可参考官方文档,这里不再列举。 4、通用序列操作(方法) 从列表、元组以及字符串可以“抽象”出序列的一些公共通用方法(不是你想像中的CRUD),这些操作包括:索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员。除此之外,还有计算序列长度、最大最小元素等内置函数。 (1)索引 1 2 3 4 5 6 str1='Hello' nums=[1,2,3,4] t1=(123,234,345) print str1[0] print nums[1] print t1[2] 输出 H 2 345 索引从0(从左向右)开始,所有序列可通过这种方式进行索引。神奇的是,索引可以从最后一个位置(从右向左)开始,编号是-1: 1 2 3 4 5 6 str1='Hello' nums=[1,2,3,4] t1=(123,234,345) print str1[-1] print nums[-2] print t1[-3] 输出: o 3 123 (2)分片 分片操作用来访问一定范围内的元素。分片通过冒号相隔的两个索引来实现: 1 2 3 4 5 6 7 8 nums=range(10) print nums print nums[1:5] print nums[6:10] print nums[1:] print nums[-3:-1] print nums[-3:] #包括序列结尾的元素,置空最后一个索引 print nums[:] #复制整个序列 输出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4] [6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [7, 8] [7, 8, 9] 不同的步长,有不同的输出: 1 2 3 4 5 6 7 8 nums=range(10) print nums print nums[0:10] #默认步长为1 等价于nums[1:5:1] print nums[0:10:2] #步长为2 print nums[0:10:3] #步长为3 ##print nums[0:10:0] #步长为0 print nums[0:10:-2] #步长为-2 输出: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 2, 4, 6, 8] [0, 3, 6, 9] [] (3)序列相加 1 2 3 4 5 6 7 str1='Hello' str2=' world' print str1+str2 num1=[1,2,3] num2=[2,3,4] print num1+num2 print str1+num1 输出: Hello world [1, 2, 3, 2, 3, 4] Traceback (most recent call last): File "F:\Python\test.py", line 7, in <module> print str1+num1 TypeError: cannot concatenate 'str' and 'list' objects (4)乘法 1 2 3 4 5 6 print [None]*10 str1='Hello' print str1*2 num1=[1,2] print num1*2 print str1*num1 输出: [None, None, None, None, None, None, None, None, None, None] HelloHello [1, 2, 1, 2] Traceback (most recent call last): File "F:\Python\test.py", line 5, in <module> print str1*num1 TypeError: can't multiply sequence by non-int of type 'list' (5)成员资格 in运算符会用来检查一个对象是否为某个序列(或者其他类型)的成员(即元素): 1 2 3 4 5 str1='Hello' print 'h' in str1 print 'H' in str1 num1=[1,2] print 1 in num1 输出: False True True (6)长度、最大最小值 通过内建函数len、max和min可以返回序列中所包含元素的数量、最大和最小元素。 1 2 3 4 5 6 7 8 str1='Hello' print len(str1) print max(str1) print min(str1) num1=[1,2,1,4,123] print len(num1) print max(num1) print min(num1) 输出: 5 o H 5 123 1 二、映射(字典) 映射中的每个元素都有一个名字,如你所知,这个名字专业的名称叫键。字典(也叫散列表)是Python中唯一内建的映射类型。 1、键类型 字典的键可以是数字、字符串或者是元组,键必须唯一。在Python中,数字、字符串和元组都被设计成不可变类型,而常见的列表以及集合(set)都是可变的,所以列表和集合不能作为字典的键。键可以为任何不可变类型,这正是Python中的字典最强大的地方。 1 2 3 4 5 6 7 8 list1=["hello,world"] set1=set([123]) d={} d[1]=1 print d d[list1]="Hello world." d[set1]=123 print d 输出: {1: 1} Traceback (most recent call last): File "F:\Python\test.py", line 6, in <module> d[list1]="Hello world." TypeError: unhashable type: 'list' 2、自动添加 即使键在字典中并不存在,也可以为它分配一个值,这样字典就会建立新的项。 3、成员资格 表达式item in d(d为字典)查找的是键(containskey),而不是值(containsvalue)。 Python字典强大之处还包括内置了很多常用操作方法,可参考官方文档,这里不再列举。 思考:根据我们使用强类型语言的经验,比如C#和Java,我们肯定会问Python中的字典是线程安全的吗。 三、集合 集合(Set)在Python 2.3引入,通常使用较新版Python可直接创建,如下所示: strs=set(['jeff','wong','cnblogs']) nums=set(range(10)) 看上去,集合就是由序列(或者其他可迭代的对象)构建的。集合的几个重要特点和方法如下: 1、副本是被忽略的 集合主要用于检查成员资格,因此副本是被忽略的,如下示例所示,输出的集合内容是一样的。 1 2 3 4 5 set1=set([0,1,2,3,0,1,2,3,4,5]) print set1 set2=set([0,1,2,3,4,5]) print set2 输出如下: set([0, 1, 2, 3, 4, 5]) set([0, 1, 2, 3, 4, 5]) 2、集合元素的顺序是随意的 这一点和字典非常像,可以简单理解集合为没有value的字典。 1 2 strs=set(['jeff','wong','cnblogs']) print strs 输出如下: set(['wong', 'cnblogs', 'jeff'])

琴瑟 2019-12-02 01:22:27 0 浏览量 回答数 0

回答

在大型面向对象的程序中,通常将类的定义放在元类中控制是很有用的。 元类可以监控类的定义,警告编程人员某些没有注意到的可能出现的问题。 有人可能会说,像这样的错误可以通过程序分析工具或IDE去做会更好些。诚然,这些工具是很有用。 但是,如果你在构建一个框架或函数库供其他人使用,那么你没办法去控制使用者要使用什么工具。 因此,对于这种类型的程序,如果可以在元类中做检测或许可以带来更好的用户体验。 在元类中选择重新定义 new() 方法还是 init() 方法取决于你想怎样使用结果类。 new() 方法在类创建之前被调用,通常用于通过某种方式(比如通过改变类字典的内容)修改类的定义。 而 init() 方法是在类被创建之后被调用,当你需要完整构建类对象的时候会很有用。 在最后一个例子中,这是必要的,因为它使用了 super() 函数来搜索之前的定义。 它只能在类的实例被创建之后,并且相应的方法解析顺序也已经被设置好了。 最后一个例子还演示了Python的函数签名对象的使用。 实际上,元类将每个可调用定义放在一个类中,搜索前一个定义(如果有的话), 然后通过使用 inspect.signature() 来简单的比较它们的调用签名。 最后一点,代码中有一行使用了 super(self, self) 并不是排版错误。 当使用元类的时候,我们要时刻记住一点就是 self 实际上是一个类对象。 因此,这条语句其实就是用来寻找位于继承体系中构建 self 父类的定义。

景凌凯 2020-04-17 17:38:05 0 浏览量 回答数 0

回答

可能有两个主要区别: Ruby具有优雅的匿名闭包。 Rails使用它们效果很好。这是一个例子: class WeblogController < ActionController::Base def index @posts = Post.find :all respond_to do |format| format.html format.xml { render :xml => @posts.to_xml } format.rss { render :action => "feed.rxml" } end end end 匿名闭包/ lambda使模拟可能会阻塞的新语言功能更加容易。在Python中,存在闭包,但是必须对其进行命名才能使用。因此,您不能使用闭包来模仿新的语言功能,而必须明确说明使用闭包的事实。 Ruby具有更干净,更易于使用的元编程。 这在Rails中得到了广泛的使用,主要是因为它易于使用。具体来说,在Ruby中,您可以在类的上下文中执行任意代码。以下片段是等效的: class Foo def self.make_hello_method class_eval do def hello puts "HELLO" end end end end class Bar < Foo # snippet 1 make_hello_method end class Bar < Foo; end # snippet 2 Bar.make_hello_method 在这两种情况下,您都可以执行以下操作: Bar.new.hello 它将打印“ HELLO”。该class_eval方法还带有一个String,因此可以在创建类时动态创建方法,这些方法基于传入的参数具有不同的语义。 实际上,可以用Python(以及其他语言)进行这种元编程,但是Ruby有优势,因为元编程不是一种特殊的编程风格。它源于以下事实:在Ruby中,一切都是对象,并且所有代码行都直接执行。结果,Classes本身就是对象,类主体self指向Class,并且您可以在创建类时在类上调用方法。 这在很大程度上要归因于Rails中可能的声明性程度,以及我们能够轻松实现看起来像关键字或新的块语言功能的新声明性功能的原因。

祖安文状元 2020-02-22 15:48:56 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播