• 关于

    python 列表式

    的搜索结果

问题

【精品问答】Python3 实例80问(附源码解析)

Python3 实例80问(附源码解析) 1.Python Hello World 实例 2.Python 数字求和 3.Python 平方根 4.Python 二次方程 5.Python 计算三角形的...
珍宝珠 2020-02-17 13:11:47 1931 浏览量 回答数 3

问题

python中列表推导式

python中列表推导式...
montos 2020-04-16 20:34:53 11 浏览量 回答数 2

问题

python常见的列表推导式?

python常见的列表推导式?...
珍宝珠 2019-12-01 21:55:42 49 浏览量 回答数 2

问题

命令行工具 CLI:用户指南:阿里云 Python SDK 列表

阿里云各产品对应的 Python SDK 如下所示。 产品Python SDK账号登录aliyun-python-sdk-aas云解析 DNSaliyun-python-sdk-alidns批量计算aliyun-python-sdk-bat...
行者武松 2019-12-01 21:52:29 1247 浏览量 回答数 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的一种独有特性,如果我被迫离开了它,我会非常想念。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导,在Python2和3中都有支持: 列表(list)推导式字典(dict)推导式集合(set)推导式 我们将一一进行讨论。一旦你知道了使用列表推导式的诀窍,你就能轻易使用任意一种推导式了。
montos 2020-04-16 20:34:06 0 浏览量 回答数 0

回答

正则表达式 正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序员们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行。 正则表达式是用来匹配处理字符串的 python 中使用正则表达式需要引入re模块 如: import re #第一步,要引入re模块 a = re.findall("匹配规则", "要匹配的字符串") #第二步,调用模块函数 以列表形式返回匹配到的字符串 如: #!/usr/bin/env python # -*- coding:utf-8 -*- import re #第一步,要引入re模块 a = re.findall("匹配规则", "这个字符串是否有匹配规则的字符") #第二步,调用模块函数 print(a) #以列表形式返回匹配到的字符串 #打印出 ['匹配规则']
寒喵 2019-12-02 01:08:04 0 浏览量 回答数 0

回答

顾名思义,filter过滤列表中的元素,并且返回一个由所有符合要求的元素所构成的列表,符合要求即函数映射到该元素时返回值为True. 这里是一个简短的例子: number_list = range(-5, 5) less_than_zero = filter(lambda x: x < 0, number_list) print(list(less_than_zero)) # 译者注:上面print时,加了list转换,是为了python2/3的兼容性 # 在python2中filter直接返回列表,但在python3中返回迭代器 # 因此为了兼容python3, 需要list转换一下 # Output: [-5, -4, -3, -2, -1] 这个filter类似于一个for循环,但它是一个内置函数,并且更快。 注意:如果map和filter对你来说看起来并不优雅的话,那么你可以看看另外一章:列表/字典/元组推导式。 译者注:大部分情况下推导式的可读性更好
montos 2020-04-16 17:52:41 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命令,这些程序将对你非常有帮助。 简易Web Server 你是否想过通过网络快速共享文件?好消息,Python为你提供了这样的功能。进入到你要共享文件的目录下并在命令行中运行下面的代码: # Python 2 python -m SimpleHTTPServer # Python 3 python -m http.server 漂亮的打印 你可以在Python REPL漂亮的打印出列表和字典。这里是相关的代码: from pprint import pprint my_dict = {'name': 'Yasoob', 'age': 'undefined', 'personality': 'awesome'} pprint(my_dict) 这种方法在字典上更为有效。此外,如果你想快速漂亮的从文件打印出json数据,那么你可以这么做: cat file.json | python -m json.tool 脚本性能分析 这可能在定位你的脚本中的性能瓶颈时,会非常奏效: python -m cProfile my_script.py 备注:cProfile是一个比profile更快的实现,因为它是用c写的 CSV转换为json 在命令行执行这条指令 python -c "import csv,json;print json.dumps(list(csv.reader(open('csv_file.csv'))))" 确保更换csv_file.csv为你想要转换的csv文件 列表辗平 您可以通过使用itertools包中的itertools.chain.from_iterable轻松快速的辗平一个列表。下面是一个简单的例子: a_list = [[1, 2], [3, 4], [5, 6]] print(list(itertools.chain.from_iterable(a_list))) # Output: [1, 2, 3, 4, 5, 6] # or print(list(itertools.chain(*a_list))) # Output: [1, 2, 3, 4, 5, 6] 一行式的构造器 避免类初始化时大量重复的赋值语句 class A(object): def __init__(self, a, b, c, d, e, f): self.__dict__.update({k: v for k, v in locals().items() if k != 'self'}) 更多的一行方法请参考Python官方文档。
montos 2020-04-16 20:55:06 0 浏览量 回答数 0

回答

初学Python在看程序时发现python中if-else的多种写法,故对其进行分析。 以下为网络内容: a, b, c = 1, 2, 3 1.常规 if a>b: c = a else: c = b 2.表达式 c = a if a>b else b 3.二维列表 c = b,a 4.传说是源自某个黑客 c = (a>b and [a] or [b])[0] 个人分析: 1、2为程序的基本语法不讨论 3:首先a>b的取值为True或False,而在python中True的默认值为1False的默认值为0。 可得c = b, a或b, a,即从列表中按下标索引的方式取值给c。 4:首先在Python中,对于逻辑运算符and 、or : and: x and y 返回的结果是决定表达式结果的值。根据"短路"原则当x为真时决定表达式的真假由y的值决定,所有返回y;如果x为假则不进行y的判断,返回x。 or: x or y 当x为真直接返回x的值;当x为假、y为真时返回y的值;当全为假时返回y的值。 所以当在式子中: 当 a>b为真:a>b and [a] 即为真,不在进行or的判断,返回[a] 当 a>b为假:a>b and [a] 即为假,返回[b] 再对列表[a]或[b]进行按下标0进行取值,得到a或b。
xuning715 2019-12-02 01:10:26 0 浏览量 回答数 0

回答

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 爬虫的工具列表

这个列表包含与网页抓取和数据处理的Python库 1. 网络 通用 urllib -网络库(stdlib)。requests -网络库。grab – 网络库(基于pycurl)。pycurl ...
驻云科技 2019-12-01 21:44:42 4079 浏览量 回答数 2

问题

【精品问答】Python数据爬取面试题库100问

Python爬虫面试题库100问: 1.遇到过得反爬虫策略以及解决方法? 2.urllib 和 urllib2 的区别? 3.列举网络爬虫所用到的网络数据包,解析包? 4.简述一下爬虫...
珍宝珠 2019-12-01 21:55:53 6502 浏览量 回答数 3

问题

【精品问答】python百大常见问题与答案详解

为了方便python开发者快速找到相关技术问题和答案,开发者社区策划了python技术常见问题内容,包含最基础的如何学python实践中遇到的技术问题。下面我逐个码字整理的python入门必会的小知识࿰...
祖安文状元 2020-02-24 17:56:41 363 浏览量 回答数 1

问题

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

为了方便python开发者快速找到相关技术问题和答案,开发者社区策划了python技术1000问内容,包含最基础的如何学python、实践中遇到的技术问题、python面试等维度内容。 我们会以每天至少50条的...
问问小秘 2019-12-01 21:57:48 456417 浏览量 回答数 22

问题

python问答学堂-《python进阶大全》中你必须掌握的QA

Python,作为一个"老练"、"小清新"的开发语言,已受到广大才男俊女的喜爱。我们也从最基础的Python粉,经过时间的摧残慢慢的变成了Python老鬼。《pyth...
montos 2020-04-16 21:56:30 34 浏览量 回答数 1

问题

【python问答学堂】4期保留最后 N 个元素?

问题 在迭代操作或者其他操作的时候,怎样只保留最后有限几个元素的历史记录? 解决方案 保留有限历史记录正是 collections.deque 大显身手的时候。比如,下面的代码在多行上面做简单...
剑曼红尘 2020-04-23 19:51:30 12 浏览量 回答数 1

问题

2018python技术问答集锦,希望能给喜欢python的同学一些帮助

小编发现问答专区中有很多人在问关于python的问题,小编把这些问题汇总一下,希望能给喜欢python的大家一些启示和帮助 本帖不定期更新,喜欢的可以收藏哦 python可能替代Java吗?感觉现在很多Java程序员都跑去学python。h...
技术小能手 2019-12-01 19:31:10 2040 浏览量 回答数 2

回答

直到Python 3.5才引入使用的语法(请参阅PEP 448)。您正在使用Python 3.4。 解决方法是,您可以显式构建所需的列表以进行解压缩: return objective_function(\*ist(optim_vars + args)) 回答来源:stackoverflow
is大龙 2020-03-23 17:22:39 0 浏览量 回答数 0

回答

在python中,集合,列表,字典,推导式是非常有用的。 可以写出优秀的代码,大大的简化了代码。并且优美 列表推导式: [x for x in range(10)] 字典推导式: {key,val for in aDict.items()} 集合推导式: {x for x in range(10)}
天枢2020 2020-04-19 12:10:51 0 浏览量 回答数 0

回答

这是python列表推导式的应用。
天枢2020 2020-04-16 16:40:20 0 浏览量 回答数 0

回答

原则上都不应该使用timeit。timeit接受Python对象,而cdef函数不是Python对象。但是,在某些情况下,Cython会自动从cdef function-> Python对象创建一个转换(有效地使其变为cpdef)。 不使用cpdef进行编译的原因是由于生成器表达式(`“”尚不支持cpdef函数内的闭包“”) var_res = sum((xi - m)\*2 for xi in desc_diff) / len(desc_diff) 我收到错误消息说这句话的,虽然有一个编译器崩溃所以他们不是在最清晰的。 将其替换为列表理解,就可以了(尽管看起来优化起来不太好) var_res = sum([(xi - m)\*2 for xi in desc_diff]) / len(desc_diff) 我的怀疑是没有为cdef函数生成自动转换的原因是该生成器表达式。 它不能编译为def函数的原因是因为您指定了返回类型。 考虑是否真的需要使它为cdef / cpdef。大多数情况下,收益很小。 回答来源:stackoverflow
is大龙 2020-03-24 20:30:53 0 浏览量 回答数 0

回答

1.列表生成式列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):list(range(1, 11))[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:L = []for x in range(1, 11):... L.append(x * x)...L[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:[x * x for x in range(1, 11)][1, 4, 9, 16, 25, 36, 49, 64, 81, 100]写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:[x * x for x in range(1, 11) if x % 2 == 0][4, 16, 36, 64, 100]还可以使用两层循环,可以生成全排列:[m + n for m in 'ABC' for n in 'XYZ']['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']三层和三层以上的循环就很少用到了。运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:import os # 导入os模块,模块的概念后面讲到[d for d in os.listdir('.')] # os.listdir可以列出文件和目录['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode']for循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value:d = {'x': 'A', 'y': 'B', 'z': 'C' }for k, v in d.items():... print(k, '=', v)...y = Bx = Az = C因此,列表生成式也可以使用两个变量来生成list:d = {'x': 'A', 'y': 'B', 'z': 'C' }[k + '=' + v for k, v in d.items()]['y=B', 'x=A', 'z=C']最后把一个list中所有的字符串变成小写:L = ['Hello', 'World', 'IBM', 'Apple'][s.lower() for s in L]['hello', 'world', 'ibm', 'apple']2.字典生成式[python] view plain copyd = {key: value for (key, value) in iterable} 其中iterable是一个可迭代的对象,比如list[python] view plain copyorg_dict = {'x': 1, 'y': 2, 'z': 3} new_dict = {v: k for k,v in some_dict.items()}
xuning715 2019-12-02 01:10:38 0 浏览量 回答数 0

回答

迭代器是遵循迭代协议的对象。用户可以使用 iter() 以从任何序列得到迭代器(如 list, tuple, dictionary, set 等)。另一个方法则是创建一个另一种形式的迭代器 —— generator 。要获取下一个元素,则使用成员函数 next()(Python 2)或函数 next() function (Python 3) 。当没有元素时,则引发 StopIteration 此例外。若要实现自己的迭代器,则只要实现 next()(Python 2)或 next()( Python 3) 生成器(Generator),只是在需要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值) 区别: 生成器能做到迭代器能做的所有事,而且因为自动创建iter()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常。
珍宝珠 2019-12-02 03:12:51 0 浏览量 回答数 0

回答

正则表达式模块 正则表达式本身是一种小型的、高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序员们可以直接调用来实现正则匹配。正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎执行 如: import re #第一步,要引入re模块 a = re.findall("匹配规则", "要匹配的字符串") #第二步,调用模块函数 以列表形式返回匹配到的字符串
路舟 2019-12-02 01:08:04 0 浏览量 回答数 0

问题

归档存储的命令行工具

归档存储 提供了便于用户日常操作的命令行工具 oascmd.py,该文档将通过一些简单的操作帮助用户快速熟悉 归档存储 的使用 环境要求 oascmd.py 需要 Python 2.7.x 版本支持,目前...
云栖大讲堂 2019-12-01 21:07:22 1445 浏览量 回答数 0

回答

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

回答

Python 正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。本章节主要介绍Python中常用的正则表达式处理函数。re.match函数re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。函数语法:re.match(pattern, string, flags=0)函数参数说明:参数 描述pattern 匹配的正则表达式string 要匹配的字符串。flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志匹配成功re.match方法返回一个匹配的对象,否则返回None。我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。匹配对象方法 描述group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。实例 !/usr/bin/python -- coding: UTF-8 -- import reprint(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配以上实例运行输出结果为:(0, 3)None实例 !/usr/bin/python import re line = "Cats are smarter than dogs" matchObj = re.match( r'(.) are (.?) .*', line, re.M|re.I) if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2)else: print "No match!!"以上实例执行结果如下:matchObj.group() : Cats are smarter than dogsmatchObj.group(1) : CatsmatchObj.group(2) : smarterre.search方法re.search 扫描整个字符串并返回第一个成功的匹配。函数语法:re.search(pattern, string, flags=0)函数参数说明:参数 描述pattern 匹配的正则表达式string 要匹配的字符串。flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。匹配成功re.search方法返回一个匹配的对象,否则返回None。我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。匹配对象方法 描述group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。实例 !/usr/bin/python -- coding: UTF-8 -- import reprint(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配以上实例运行输出结果为:(0, 3)(11, 14)实例 !/usr/bin/python import re line = "Cats are smarter than dogs"; searchObj = re.search( r'(.) are (.?) .*', line, re.M|re.I) if searchObj: print "searchObj.group() : ", searchObj.group() print "searchObj.group(1) : ", searchObj.group(1) print "searchObj.group(2) : ", searchObj.group(2)else: print "Nothing found!!"以上实例执行结果如下:searchObj.group() : Cats are smarter than dogssearchObj.group(1) : CatssearchObj.group(2) : smarterre.match与re.search的区别re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。实例 !/usr/bin/python import re line = "Cats are smarter than dogs"; matchObj = re.match( r'dogs', line, re.M|re.I)if matchObj: print "match --> matchObj.group() : ", matchObj.group()else: print "No match!!" matchObj = re.search( r'dogs', line, re.M|re.I)if matchObj: print "search --> matchObj.group() : ", matchObj.group()else: print "No match!!"以上实例运行结果如下:No match!!search --> matchObj.group() : dogs检索和替换Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。语法:re.sub(pattern, repl, string, count=0, flags=0)参数:pattern : 正则中的模式字符串。repl : 替换的字符串,也可为一个函数。string : 要被查找替换的原始字符串。count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。实例 !/usr/bin/python -- coding: UTF-8 -- import re phone = "2004-959-559 # 这是一个国外电话号码" 删除字符串中的 Python注释 num = re.sub(r'#.*$', "", phone)print "电话号码是: ", num 删除非数字(-)的字符串 num = re.sub(r'D', "", phone)print "电话号码是 : ", num以上实例执行结果如下:电话号码是: 2004-959-559 电话号码是 : 2004959559repl 参数是一个函数以下实例中将字符串中的匹配的数字乘以 2:实例 !/usr/bin/python -- coding: UTF-8 -- import re 将匹配的数字乘以 2 def double(matched): value = int(matched.group('value')) return str(value * 2) s = 'A23G4HFD567'print(re.sub('(?Pd+)', double, s))执行输出结果为:A46G8HFD1134re.compile 函数compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。语法格式为:re.compile(pattern[, flags])参数:pattern : 一个字符串形式的正则表达式flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:re.I 忽略大小写re.L 表示特殊字符集 w, W, b, B, s, S 依赖于当前环境re.M 多行模式re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)re.U 表示特殊字符集 w, W, b, B, d, D, s, S 依赖于 Unicode 字符属性数据库re.X 为了增加可读性,忽略空格和 # 后面的注释实例实例 import repattern = re.compile(r'd+') # 用于匹配至少一个数字m = pattern.match('one12twothree34four') # 查找头部,没有匹配print m None m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配print m None m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配print m # 返回一个 Match 对象 <_sre.SRE_Match object at 0x10a42aac0> m.group(0) # 可省略 0 '12' m.start(0) # 可省略 0 3 m.end(0) # 可省略 0 5 m.span(0) # 可省略 0 (3, 5)在上面,当匹配成功时返回一个 Match 对象,其中:group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;span([group]) 方法返回 (start(group), end(group))。再看看一个例子:实例 import repattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I 表示忽略大小写m = pattern.match('Hello World Wide Web')print m # 匹配成功,返回一个 Match 对象 <_sre.SRE_Match object at 0x10bea83e8> m.group(0) # 返回匹配成功的整个子串 'Hello World' m.span(0) # 返回匹配成功的整个子串的索引 (0, 11) m.group(1) # 返回第一个分组匹配成功的子串 'Hello' m.span(1) # 返回第一个分组匹配成功的子串的索引 (0, 5) m.group(2) # 返回第二个分组匹配成功的子串 'World' m.span(2) # 返回第二个分组匹配成功的子串 (6, 11) m.groups() # 等价于 (m.group(1), m.group(2), ...) ('Hello', 'World') m.group(3) # 不存在第三个分组 Traceback (most recent call last): File "", line 1, in IndexError: no such groupfindall在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。注意: match 和 search 是匹配一次 findall 匹配所有。语法格式为:findall(string[, pos[, endpos]])参数:string : 待匹配的字符串。pos : 可选参数,指定字符串的起始位置,默认为 0。endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。查找字符串中的所有数字:实例 -- coding:UTF8 -- import re pattern = re.compile(r'd+') # 查找数字result1 = pattern.findall('runoob 123 google 456')result2 = pattern.findall('run88oob123google456', 0, 10) print(result1)print(result2)输出结果:['123', '456']['88', '12']re.finditer和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。re.finditer(pattern, string, flags=0)参数:参数 描述pattern 匹配的正则表达式string 要匹配的字符串。flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志实例 -- coding: UTF-8 -- import re it = re.finditer(r"d+","12a32bc43jf3") for match in it: print (match.group() ) 输出结果:12 32 43 3re.splitsplit 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:re.split(pattern, string[, maxsplit=0, flags=0])参数:参数 描述pattern 匹配的正则表达式string 要匹配的字符串。maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志实例 import rere.split('W+', 'runoob, runoob, runoob.')['runoob', 'runoob', 'runoob', '']re.split('(W+)', ' runoob, runoob, runoob.') ['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', ''] re.split('W+', ' runoob, runoob, runoob.', 1) ['', 'runoob, runoob, runoob.'] re.split('a*', 'hello world') # 对于一个找不到匹配的字符串而言,split 不会对其作出分割 ['hello world']正则表达式对象re.RegexObjectre.compile() 返回 RegexObject 对象。re.MatchObjectgroup() 返回被 RE 匹配的字符串。start() 返回匹配开始的位置end() 返回匹配结束的位置span() 返回一个元组包含匹配 (开始,结束) 的位置正则表达式修饰符 - 可选标志正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:修饰符 描述re.I 使匹配对大小写不敏感re.L 做本地化识别(locale-aware)匹配re.M 多行匹配,影响 ^ 和 $re.S 使 . 匹配包括换行在内的所有字符re.U 根据Unicode字符集解析字符。这个标志影响 w, W, b, B.re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。正则表达式模式模式字符串使用特殊的语法来表示一个正则表达式:字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。多数字母和数字前加一个反斜杠时会拥有不同的含义。标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。反斜杠本身需要使用反斜杠转义。由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r't',等价于 '\t')匹配相应的特殊字符。下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。模式 描述^ 匹配字符串的开头$ 匹配字符串的末尾。. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'1 不在[]中的字符:2 匹配除了a,b,c之外的字符。re* 匹配0个或多个的表达式。re+ 匹配1个或多个的表达式。re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式re{ n} 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。re{ n,} 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式a| b 匹配a或b(re) 匹配括号内的表达式,也表示一个组(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。(?: re) 类似 (...), 但是不表示一个组(?imx: re) 在括号中使用i, m, 或 x 可选标志(?-imx: re) 在括号中不使用i, m, 或 x 可选标志(?#...) 注释.(?= re) 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功(?> re) 匹配的独立模式,省去回溯。w 匹配字母数字及下划线W 匹配非字母数字及下划线s 匹配任意空白字符,等价于 [tnrf].S 匹配任意非空字符d 匹配任意数字,等价于 [0-9].D 匹配任意非数字A 匹配字符串开始Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。z 匹配字符串结束G 匹配最后匹配完成的位置。b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'erb' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。B 匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。n, t, 等. 匹配一个换行符。匹配一个制表符。等1...9 匹配第n个分组的内容。10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。正则表达式实例字符匹配实例 描述python 匹配 "python".字符类实例 描述[Pp]ython 匹配 "Python" 或 "python"rub[ye] 匹配 "ruby" 或 "rube"[aeiou] 匹配中括号内的任意一个字母[0-9] 匹配任何数字。类似于 [0123456789][a-z] 匹配任何小写字母[A-Z] 匹配任何大写字母[a-zA-Z0-9] 匹配任何字母及数字3 除了aeiou字母以外的所有字符4 匹配除了数字外的字符特殊字符类实例 描述. 匹配除 "n" 之外的任何单个字符。要匹配包括 'n' 在内的任何字符,请使用象 '[.n]' 的模式。d 匹配一个数字字符。等价于 [0-9]。D 匹配一个非数字字符。等价于 4。s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。S 匹配任何非空白字符。等价于 5。w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。W 匹配任何非单词字符。等价于 '6'。 Python 面向对象 Python CGI编程 1 篇笔记 jim 264*7522@qq.com正则表达式实例: !/usr/bin/python import reline = "Cats are smarter than dogs"matchObj = re.match( r'(.) are (.?) .*', line, re.M|re.I)if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2) else: print "No match!!" 正则表达式:r'(.) are (.?) .*'解析:首先,这是一个字符串,前面的一个 r 表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。但是这个字符串里没有反斜杠,所以这个 r 可有可无。 (.) 第一个匹配分组,. 代表匹配除换行符之外的所有字符。 (.?) 第二个匹配分组,.? 后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符 后面的一个 .* 没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符matchObj.group(1) 得到第一组匹配结果,也就是(.*)匹配到的matchObj.group(2) 得到第二组匹配结果,也就是(.*?)匹配到的因为只有匹配结果中只有两组,所以如果填 3 时会报错。 ... ↩ abc ↩ aeiou ↩ 0-9 ↩ fnrtv ↩ A-Za-z0-9_ ↩
xuning715 2019-12-02 01:10:40 0 浏览量 回答数 0

回答

如果您的字符串仅包含基本文字(即字符串,字节,数字,元组,列表,字典,集合,布尔值和“无”),则可以使用ast模块来解析字符串(ast.literal_eval)。 : import ast in_str = """[["a","bb"],["c12","dddd"],["and","so on"]]""" res_list = ast.literal_eval(in_str) print(res_list) # [['a','bb'],['c12','dddd'],['and','so on']] 从文档中: 这可用于安全地评估包含来自不受信任来源的Python值的字符串,而无需自己解析值。它不能评估任意复杂的表达式,例如涉及运算符或索引的表达式。 但您还应该注意: 由于Python AST编译器中的堆栈深度限制,使用足够大/复杂的字符串可能会使Python解释器崩溃。 如果您还需要平整结果列表,则可以按照答案如何从列表列表中制作平整列表? 我从那篇博文中喜欢的一种方法是: import functools import operators flat_list = functools.reduce(operator.iconcat, res_list, []) print(flat_list) # ['a', 'bb', 'c12', 'dddd', 'and', 'so on'] 根据您提供给我们的信息,很难以json表示形式转换该字符串,但是可以尝试考虑您拥有两个元素列表的列表。如果我们将内部列表中的两个元素视为(键,值)关系,则可以通过以下方式创建与json兼容的字典: json_dict = dict(res_list) print(json_dict) # {'a': 'bb', 'c12': 'dddd', 'and': 'so on'} import json json.dumps(json_dict) # '{"a": "bb", "c12": "dddd", "and": "so on"}' 回答来源:stackoverflow
is大龙 2020-03-23 17:45:58 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT