print()函数现在,你需要让手指习惯于输入print("hello")而不是原来的print"hello",这是因为print现在是一个函数,不再是语句让我们考虑需要将标准输出(stdout)重定向到日志的情况。新语法只需要给print()函数的关键字参数文件传递一个值,例如:fid=open("log.txt","a")print("log.txt",file=fid)这样代码有更清晰的语法。另一个好处是可以通过将字符串传递给sep关键字参数来更改分隔符,并且可以通过将另一个字符串传递给end关键字参数来更改结束字符串。要更改分隔符,请使用:print("Foo","Bar",sep="%")一般来说,新语法是:print(object,...[,end='endline_character_here'][,file=redirect_to_here])其中,方括号([])中的代码是可选的。默认情况下,当仅调用print()本身时,换行符(\n)会附加到结果中。raw_input()到input()在Python版本2.x中,raw_input()从标准输入(sys.stdin)读取输入并返回一个字符串,其中从末尾删除了尾随换行符。在Python2.x版本2.x中,input()函数需要一个有效的Python表达式。在Python3中,raw_input()被重命名为input(),这样就可以从标准输入中获取数据,而无需导入。如果需要保留2.x版的input()功能,可以使用eval(input()),其效果基本相同。新数据类型bytesliteral和bytesobject的目的是存储二进制数据。此对象是一个不可修改的整数序列,从0到127或纯ASCII字符。实际上,它是2.5版本中bytearray对象的不可修改版本。字节文字是一个以b开头的字符串——例如,b'byteliteral'。对bytesliteral的计算会产生一个新的bytes对象。可以使用bytes()函数创建一个新的字节对象。bytes对象的构造函数为:bytes([initializer[,encoding]])例如:b=(b'\xc3\x9f\x65\x74\x61′)print(b)b'\xc3\x83\xc2\x9feta'将创建一个字节对象,但这是多余的,因为字节对象可以完全通过分配字节文字来创建。(我只是想证明这是可能的,但我不推荐它。)如果你想使用iso-8859-1编码,试试这个:b=bytes('\xc3\x9f\x65\x74\x61','iso-8859-1')print(b)b'\xc3\x83\xc2\x9feta'如果初始化器是字符串,则必须提供编码。如果初始值设定项是字节文字,则无需指定编码类型:请记住字节文字不是字符串。但与字符串类似,多个字节可以串联:b'hello'b'world'b'helloworld'使用bytes()方法表示二进制数据和编码文本。要将bytes转换为str,必须解码bytes对象(稍后会详细介绍)。二进制数据使用decode()方法进行编码。例如:b'\xc3\x9f\x65\x74\x61'.decode()'?eta'也可以直接从文件中读取二进制数据。请看下面的代码:data=open('dat.txt','rb').read()print(data)#data是这里打印出来的data.txt的字符串内容它的作用是以二进制方式打开文件读取其中的文件对象,并读取整个文件。字符串Python有一个单一的字符串类型str,其功能类似于2.x版本的unicode类型。换句话说,所有字符串都是unicode字符串。而且——对于非拉丁文本的用户来说也非常方便——现在允许使用非ASCII标识符。例如:césar=["author","consultant"]print(césar)['author','consultant']在以前的Python版本中,repr()方法会将8位字符串转换为ASCII。例如:repr('é')"'\xc3\xa9'"现在,它将返回一个unicode字符串:repr('é')"'é'"正如我之前提到的,这个字符串是以String类型构建的。字符串对象和字节对象不兼容。如果你想得到字节的字符串表示,你需要使用它的decode()方法。相反,如果你想从字符串中获取字节文字表示,你可以使用字符串对象的encode()方法。字符串格式的变化许多Python程序员认为用于格式化字符串的内置%运算符过于有限,因为:?它是一个最多接受两个参数的二元运算符。?除格式字符串参数外,所有其他参数必须用元组或字典打包。这种格式化有些不灵活,因此Python3引入了一种新的字符串格式化方法(版本3保留了%运算符和string.Template模块)。字符串对象现在有一个方法format()接受位置和关键字参数,这两个参数都被传递到替换字段。替换字段由字符串中的大括号({})表示。替换字段中的元素简称为字段。这是一个简单的示例:“我喜欢{0}、{1}和{2}”.format("eggs","bacon","sausage")'Iloveeggs,bacon,andsausage'field{0}、{1}和{2}通过位置参数eggs、bacon和sausage传递给format()方法。以下示例显示如何使用format()通过传递关键字参数来格式化:“我喜欢{a}、{b}和{c}”。format(a="eggs",b="bacon",c="sausage")'我喜欢鸡蛋、培根和香肠'下面是结合位置参数和关键字参数的另一个示例:“我喜欢{0}、{1}和{param}”。format("eggs","bacon",param="sausage")'我喜欢鸡蛋、培根和香肠'请记住,将非关键字参数放在关键字参数之后是语法错误。要转义大括号,只需将大括号加倍,如下所示:"{{0}}".format("can'tseeme")'{0}'positionalparametercan'tseemeisnotoutputbecausethere没有要输出的字段。请注意,这不会产生任何错误。新的format()内置函数可以格式化单个值。例如:print(format(10.0,"7.3g"))10也就是说,g代表通用格式,输出一个固定宽度的值。小数点前的第一个数字指定最小宽度,小数点后的数字指定精度。格式说明符的完整语法超出了本文的范围,更多信息可以在本文的参考资料部分找到。内置字典类型的更改3.0中的另一个重大更改是删除了字典上的dict.iterkeys()、dict.itervalues()和dict.iteritems()方法。相反,.keys()、.values()和.items()已被修补以返回轻量级、类似集合的容器对象,而不是键和值列表。这样做的好处是可以在不复制键和条目的情况下对其执行设置操作。例如:d={1:”dead”,2:”parrot”}print(d.items())注意:在Python中,集合是唯一元素的无序集合。在这里,我创建了一个包含两个键和值的字典,然后输出d.items()的值,它返回一个对象而不是值列表。你可以像set对象一样测试一个元素的成员资格,例如:1ind#testformembershipTrue下面是一个遍历dict_values对象的条目的例子:forvaluesind.items():...print(values)...deadparrot然而,如果你真的想要一个值列表,你可以转换返回的dict对象。例如:keys=list(d.keys())print(keys)[1,2]新的I/OABC是不能实例化的类。要使用ABC,子类必须从这个ABC继承并覆盖它的抽象方法。如果方法的前缀使用@abstractmethod装饰器,则该方法是抽象方法。新的ABC框架还提供了@abstractproperty修饰符来定义抽象属性。可以通过导入标准库模块abc来访问这个新框架。清单1中显示了一个简单的示例。清单1.一个简单的抽象基类fromabcimportABCMetaclassSimpleAbstractClass(metaclass=ABCMeta):passSimpleAbstractClass.register(list)assertisinstance([],SimpleAbstractClass)register()方法调用接受一个类作为它的参数,并使这个ABC成为注册类的子类。这可以通过调用最后一行的assert语句来验证。清单2是另一个使用修饰符的示例。清单2.使用修饰符的抽象基类fromabcimportABCMeta,abstractmethodclassabstract(metaclass=ABCMeta):@abstractmethoddefabsMeth(self):passclassA(abstract):#mustimplementabstractmethoddefabsMeth(self):return0与ABCs顺便说一句,我们可以继续探索新的I/O系统。以前的Python发行版缺少一些重要但不错的函数,例如用于类流对象的seek()。类流对象是一些类文件对象——比如套接字或文件——具有read()和write()方法。Python3有许多用于类流对象的I/O层——原始I/O层、缓冲I/O层和文本I/O层——每个层都有自己的ABC和实现定义。要打开流,您仍然需要使用内置的open(fileName)函数,但您也可以调用io.open(fileName))。这样做会返回一个缓冲的文本文件;read()和readline()返回字符串(注意Python3中的所有字符串都是unicode)。您还可以使用open(fileName,'b')打开缓冲的二进制文件。在这种情况下,read()返回字节,但不能使用readline()。这个内置open()函数的构造函数是:open(file,mode=”r”,buffering=None,encoding=None,errors=None,newline=None,closefd=True)可能的模式是:r:read?w:openforwriting?a:openforappend?b:binarymode?t:textmode?+:openadiskfileforupdate?U:universalnewlinemode默认模式为rt,即为读取文本打开模式。buffering关键字参数的预期值是确定缓冲策略的以下三个整数之一:?0:关闭缓冲?1:行缓冲?>1:完全缓冲(默认)默认编码与平台无关。关闭文件描述符或closefd可以是True或False。如果为False,则在文件关闭后保留此文件描述符。如果文件名不起作用,则closefd必须设置为True。open()返回的对象取决于您设置的模式。表1显示了返回类型。表1.不同打开模式的返回类型Mode返回对象TextModeTextIOWrapperBinaryBufferedReaderWriteBinaryBufferedWriterAppendBinaryBufferedWriterRead/WriteModeBufferedRandom注:TextMode可以是w、r、wt、rt等,如清单3所示打开缓冲的二进制流以供读取。清单3.打开缓冲二进制流进行读取访问许多有用的方法,例如isatty、peek、raw、readinto、readline、readlines、seek、seekable、tell、writable、write和writelines。要查看完整列表,请在BufferedReader对象上运行dir()。以上就是本次分享的全部内容。现在想学习编程的朋友欢迎关注Python技术大本营获取更多技能和教程。
