Python学习笔记整理(九)Pytho
赋值语句,表达式语句,打印
一、赋值语句
赋值语句给对象命名,基本形式是在等号左边写赋值语句的目标,右边写赋值的对象。左边可以是变量名或对象元素,而右侧的对象可以是任何会计算得到的对象表达式 。
1、赋值语句的特性
* 赋值语句建立对象引用值。建立变量到对象的应用。
* 变量名在首次赋值时会被创建。
当这个变量名出现在表达式中,就会被其所引用值取代
*变量名在引用前必须先赋值。也就是必须建立变量名到对象的引用关系。
* 隐式赋值语句
import、from、del、class、for、函数参数。等模块导入,函数和类的定义,for循环变量以及函数参数都是隐式赋值运算。
2、赋值语句的形式
运算 解释
diege='diege' 基本形式
diege,lily='yum','wang' 元组赋值运算(位置性)
[diege,lily]=['yum','YUM'] 列表赋值运算(位置性)
a,b,c,d='dieg'
序列赋值运算,通用性 #MS不行,数量要一致。
name=uname='diege' 多目标赋值运算
diege += 43 增强赋值运算(相当于diege=diege+43)
* 元组及列表分解赋值
第二,第三种形式是相关的,当在“=”左边编写元组或列表时,python会按照位置把右边对象和左边的目标从左到右相配对。
* 序列赋值语句
在新的Python版本,元组和列表赋值语句已统一为现在所谓的序列赋值语句的实例。--任何变量名的需里都可以赋值给任何值的序列。而Python会按位置一次赋值一个元素。如第四行。把变量名的元组和字符串的字符对应起来。
*多重目标赋值
如第五行,赋值相同对象给右边所有目标。
*增强赋值语句
以简洁的方式结合表达式和赋值语句的简写形式 。增强形式输入比较少,运行更快。在Python中,每个二元表达式运算符的都有增强赋值语句。
3、序列赋值
1)、基本
>>> nudge=1
>>> wink=2
>>> A,B=nudge,wink
>>> A,B
(1, 2)
>>> [C,D]=[nudge,wink]
>>> C,D
(1, 2)
右侧可以是任何类型的序列,包括变量。只要长度相等即可
2)、高级序列赋值语句模式
注意:虽然可以在“=”符号两侧混合和匹配序列类型,右边元素的数目还是要左边的变量的数目相同,不然会产生错误。
想要更通用的话,就需要使用分片了
>>> string='diege'
>>> a,b,c=string[0],string[1],string[2]
>>> a,b,c
('d', 'i', 'e')
>>> a,b,c=list(string[:2])+[string[2:]]
>>> a,b,c
('d', 'i', 'ege')
可以赋值嵌套序列
>>> ((a,b),c)=('DI','GE')
>>> a,b,c
('D', 'I', 'GE')
4、多目标赋值语句
>>> a=b=c=d='diege'
>>> a,b,c,d
('diege', 'diege', 'diege', 'diege')
多目标赋值以及共享引用
上面一个对象,四个变量共享(全指向内存同一对象),这种对于不可能变的类型而言没有问题,如果是可变的类型就需要小心。
5、增强赋值语句
x+=y x-=y x*=y x/=y x&=y x|=y x^=y x%=y x>>=y x<<=y x**=y x//=y
增强赋值以及共享引用
>>> L=[1,2]
>>> M=L
>>> L=L+[3,4] #指向新的对象
>>> M,L
([1, 2], [1, 2, 3, 4])
>>> L=[1,2]
>>> M=L
>>> L+=[3,4] #修改了原来的对象
>>> M,L
([1, 2, 3, 4], [1, 2, 3, 4])
这只对列表和字典这类可变对象才重要,而且相当罕见的情况。如果你需要打破共享引用值的结构,就要对可便对象进行拷贝。
二、变量命名规则
语句:(下划线或者字母)+(任意数目的字母,数字或下划线)
注意:
区分大小写,DIEGE和diege不同。Python程序区分大小写
1、禁止使用保留字
2、命令习惯
* 以单一下划线开头的变量名(_X)不会被from module import *语句导入的。
* 前后有下划线的变量名(__X__)是系统定义的变量名,对解释器有特殊意义。
* 以两个下划线开头,但结尾没有两个下划线的变量名(__X)是类本地(压缩)变量。
* 通过交互模式运行时,只有单个下划线变量(_)会保存最后的表达式结果。
3、变量名没有类型,但对象有
三、表达式语句
1、表达式语句介绍
在Python中可以使用表达式作为语句 (本身只占一行)。但是,因为表达式结果不会被存储,只有当表达式工作并作为附加的效果,这样才有意义。通常在两种情况下表达式用语句。
*调用函数和方法
有些函数和方法会做很多工作,而不会返回值,这种函数在其他语言中有时称为流程。因为他们不会返回你可能想保留的值,所以你可以用表达式语句调用这些函数。
*在交互模式提示符下打印值
Python会在交互模式命令行中响应输入的表达式的结果,从技术上讲,这些也是表达式语句,作为输入print语句的简写方法。
常见的python表达式语句
运算 解释
spam(eggs,ham) 函数调用
spam.ham(eggs) 方法调用
spam 在交互模式解释器内打印变量
spam < ham and ham != eggs 符合表达式
spam < ham < eggs 范围表达式
注意:虽然表达式在python中可以作为语句出现,但语句不能作为表达式。例如python不让你把赋值语句(=)嵌入其他表达式中。这样做的理由是为了避免常见的编码错误。当用“==”做相等测试时,不会打成“=”而意外改变量的值。
2、表达式语句和在原处修改
>>> L=[1,2]
>>> L.append(3)
>>> L
[1, 2, 3]
注意不要写成来L=L.append(3)
赋值语句
对列表调用append,sort,reverse这类在原处修改的元算,一定是对列表在原处的修改,但这些方法在列表修改后并不会把列表返回。
四、打印语句
1、打印语句
print语句可以实现打印—只是对程序员友好的标准输出流的接口而已。技术上讲,这是把对象转换为其他文本表达式形式,然后发送给标准输出。
标准输出流与C语言的stdout类似,通常对应到启动Python程序所在的窗口(除非shell上重定向到了文件或管道中)
print 语句形式
运算 解释
print 'diege,test'
把对象打印至sys.stdout,在元素之间增加一个空格,以及在末尾增加换行符。
print 'diege,test'
一样,但是在文本末尾没有加换行符字符。
>>> myfile=open('/tmp/pydata','w')
>>> print >> myfile, "diege,test"
把文件传给myfile.write,而不是sys.stdout.write
注意:print的内容是字符串一定要用引号扩起来。
可是使用字符串合并和格式化工具,自己创建输出的的字符串,之后再一次打印出字符串。
>>> x='hello'
>>> y='world'
>>> print '%s,%s' % (x,y)
hello,world
2、重定向输出流
print x
等价于
import sys
sys.stdout.write(str(x)+'\n')
可以把sys.stdout重新赋值给标准输出流意外的的东西,这种等效的方式提供了一种方法,可以让print语句将文字传送到其他地方。
>>> import sys
>>> sys.stdout=open('/tmp/python.log','a',0)
>>> x,y,z=1,2,3
>>> print x,y,x
>>> print x,y,z
$ tail -f /tmp/python.log
事实上可以将sys.stdout重设为非文件的对象。只要该对象有预期的协议(write方法)。当该对象是类时,打印的文字可以定位并通过任意方式进行处理。
不过,为了基于print的程序重定向,sys.stdout重设提供了修改每个print语句以外的便利方式。或者使用系统shell重定向语法。
上面有一个问题,打印到文件后需要切换回来。不然所有的print输出都打印到文件来了
>>> import sys
>>> temp=sys.stdout
>>> sys.stdout=open('log.txt','a')
>>> print 'diege'
>>> print 1,2,3
>>> sys.stdout.close()
>>> print 1,2,3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file
>>> sys.stdout=temp
>>> print 1,2,3
1 2 3
网络上有一个比较好的范例说明
Http://www.cnblogs.com/MikeZhang/arcHive/2012/01/19/ioRedirect.html
这样的方式太麻烦。因此增加了print的扩展功能,从而没有必要非得这么做
当print 语句以>>开始,后面再跟着输出的文件对象(或其他对象)时,该print语句可以将文字传给该对象的write方法,但是不用重设sys.stdout。因为这种重定向是暂时的。普通的print语句还是会继续打印到原始的输出流的。
>>> log=open('log.txt','a',0)
>>> x,y,z=10,11,12
>>> print >> log,x,y,z
>>> diege='diege test'
>>> print >> log,diege
>>> print 123
123
>>> log.close()
>>> print 123
123
如果需要在同一个程序中打印到文件以及标准输出流。print的>>形式就很方便,然而,如果你使用这种形式,需要提供一个文件对象(或者和文件对象一样有write方法的对象),而不是文件名字符串。
这种print的扩展形式通常也用于把错误信息打印到标准错误流sys.stderr.可以使用文件write的方法愿意及自动设置输出的格式,或者重定向语法打印:
>>> import sys
>>> sys.stderr.write(('Bad!'*8)+'\n')
Bad!Bad!Bad!Bad!Bad!Bad!Bad!Bad!
>>> print >> sys.stderr,'Bad!'*8
Bad!Bad!Bad!Bad!Bad!Bad!Bad!Bad!
在ptyhon3.0中 ,print语句将变为内置函数,功能相同,但语法稍有不同。目标文件和列结尾行行为是由关键词参数赋值的。例如,语句 print x,y会调用print(x,y),而print >> f,x会变成print (x,file-f,end='').
相关文章