【3】.禁止使用保留字
=======================================================================================
命名惯例:
1.以单一下划线开头的变量名(_X)不会被from module import *语句导入
2.前后有下划线的变量名(__X__)是系统定义的变量名,对解释器有特殊意义
3.以两个下划线开头、但结尾没有两个下划线的变量名(__X)是类的本地变量
4.通过交互模式运行时,只有单个下划线的变量名(_)会保存最后表达式的结果
=======================================================================================
变量名没有类型,但对象有
【类型属于对象,而不是变量,比如a = 3,这时候a是整数类型,下一句执行a="3",a又变成了字符串类型,这是根据a变量指向的对象决定的,而不是a变量决定的】
参考Python的动态数据类型
=======================================================================================
打印操作
在Python中,print语句可以实现打印——只是对程序员友好的标准输出流的接口而已。
从技术角度上讲,这是把一个或多个对象转换为其文本表达形式,然后发送给标准输出或另一个类似文件的流。更详细地说,在Python中,打印与文件和流的概念紧密相连。
文件对象方法:
文件写入方法是把字符串写入到任意的文件,print默认地把对象打印到stdout流,添加了一些自动的格式化。和文件方法不同,在使用打印操作的时候,不需要把对象转换为字符串。
标准输出流:
标准输出流(通常叫做stdout)只是发送一个程序的文本输出的默认的地方。加上标准输入流和错误流,它只是脚本启动时所创建的3种数据连接的一种。标准输出流通常映射到启动Python程序的窗口,除非它已经在操作系统的shell中重定向到一个文件或管道。
由于标准输出流在Python中可以作为内置的sys模块中的stdout文件对象使用(例如,sys.stdout),用文件的写入方法调用来模拟print成为可能,然而,print很容易使用,这使得很容易就能把文本打印到其他文件或。
=======================================================================================
Python 3.0的print函数
形式如下:
print([object,...][,sep=' '][,end='\n'][,file=sys.stdout])
这个内置函数把sep所分隔开的一个或多个对象的文本表示,后面跟着的字符串end,都打印到流file中
sep,end和file部分如果给出的话,必须作为关键字参数给定——也就是说,必须使用一种特殊的“name=value”语法来根据名称而不是根据位置来传递参数。
--sep是在每个对象的文本之间插入的一个字符串,如果没有传递的话,它默认的是一个单个的空格;传递一个空字符串将会抑制分隔符。
--end是添加在打印文本末尾的一个字符串,如果没有传递的话,它默认的是一个\n换行字符。传递一个空字符串将会避免在打印的文本的末尾移动到下一个输入行
--file指定了文本将要发送到的文件、标准流或者其他类似文件的对象;如果没有传递的话,它默认是sys.stdout。
例子如下:
>>> print()
>>> x = 'spam'
>>> y = 99
>>> z = ['eggs']
>>> print(x,y,z)
spam 99 ['eggs']
这里不需要把对象转换为字符串,而在文件写入方法中则需要这么做。默认情况下,print调用在打印的对象之间添加一个空格,要取消这个空格,给sep关键字参数发送一个空字符串,或者发送一个自己所选择的替代分隔符:
>>> print(x,y,z,sep=',')
spam,99,['eggs']
>>> print(x,y,z,sep='')
spam99['eggs']
默认情况下,print添加一个行末字符来结束输出行。你可以通过向end关键字参数传递一个空字符串来抑制这一点并避免换行,或者可以传递一个自己的不同的终止符(包含一个\n符号来手动地换行):
>>> print(x,y,z,end='');print(x,y,z)
spam 99 ['eggs']spam 99 ['eggs']
>>> print(x,y,z,end='...\n')
spam 99 ['eggs']...
也可以组合关键字参数来指定分隔符和行末字符串——它们可以以任何顺序出现,但是必须出现在所有要打印的对象的后面:
>>> print(x,y,z,sep='...',end='!\n')
spam...99...['eggs']!
这里展示如何使用file关键字——它在单个打印的过程中,直接把文本打印到一个输出文件或者其他的可兼容对象(这其实是流重定向的一种形式)
>>> print(x,y,z,sep='...',file=open('E:\\data.txt','w'))
=================================================================
======================
如果你想更复杂一点,可以使用以下的方式编写打印操作:
>>> sys.stdout.write('Hello world\n')
Hello world
12
------------------------
------------------------
------------------------
------------------------
---------------------------------------------------------
重定向输出流
通常来说,print和sys.stdout的关系如下:
print(x,y) 等价于
import sys
sys.stdout.write(str(X)+' '+str(Y)+'\n')
它通过str手动执行一次字符串转换,再通过‘+’增加一个分隔符和一个换行,并且调用输出流write方法。
作为较长的打印书写形式本身并没有什么用处,不过了解了这就是print语句所做的事情是有用处的,因为有可能把sys.stdout重新复制给标准输出流以外的东西。
换句话说,这种等效的方式提供了一种方法,可以让print语句将文字传送到其他地方。例如:
>>> import sys
>>> sys.stdout = open(r'E:\log.txt','a')
...
>>> print(x,y,z)
通过这种方式赋值sys.stdout会把程序中任何地方的每个print都进行重新定向
自动化流重定向
通过赋值sys.stdout而将打印文字重定向的技巧实际上非常实用。但是有一个问题,就是没有直接的方式可以保存原始的输出流。在打印至文件后,可以切换回来。因为sys.stdout只是普通的文件对象,你可以存储它,需要时恢复它:
>>> import sys
>>> temp = sys.stdout
>>> sys.stdout = open('E:\\log.txt','a')
>>> print('spam')
>>> print(1,2,3)
>>> sys.stdout.flush()
>>> sys.stdout.close()
>>> sys.stdout = temp
>>> print('back here...')
back here...
>>> print(open('E:\\log.txt','r').read())
spam
1 2 3
然而如你所见,像这样的手动保存和恢复原始的输出流包含了相当多的额外工作,因为这种操作出现的相当频繁,一个print扩展功能使得它显得多余。
在Python3.0中,file关键字,允许一个单个的print调用将其文本发送给一个文件的write方法,而不用真正地重设sys.stdout。
例如,如下语句再次把打印的文本发送到一个名为log.txt的文件:
>>> log = open(r'E:\log.txt','a')
>>> print(1,2,3,file=log)
>>> print(4,5,6,file=log)
>>> log.close()
这种print的扩展形式通常也用于把错误消息打印到标准错误流sys.stderr,可以使用其文件write方法以及自行设置输出的格式,或者使用重定向语法打印:
>>> sys.stderr.write('Bad!'*8+'\n')
Bad!Bad!Bad!Bad!Bad!Bad!Bad!Bad!
33
>>> print("Bad!"*8,file = sys.stderr)
Bad!Bad!Bad!Bad!Bad!Bad!Bad!Bad!