参照:python程序设计第三版
python programming:an introduction to computer science
第二章:编写简单程序
首先理解什么是“”元语言“”
元语言:计算机科学家开发的复杂的符号表示法(类似于模板)
我们依靠这种模板符号来表示语句的语法
print语句
print(<expr>,<expr>,...,sep=' ',end='\n',file=sys.stdout)
expr == expression 表达式
sep == separation 间隔符
end 文本结束标记符
\n 换行符
file 输出位置
sys == system
stdout == standard output 标准输出
可以显式地覆盖默认值来改变参数
>>>print (1,1,1)
1 1 1
>>>print(1,1,1,sep = '+',end = '.')
1+1+1.
例如可以让print不打印到控制台,而是文本文件
但不可以这么用,要先打开文件(关于这个的机制以后讲,简单说就是要先打开文件将其内容读取到RAM,然后对RAM中的内容操作)
这样就行
要知道:print()函数实质调用了sys.stdout.write()并在结束时附了一个'\n'换行符
想要使用print()输出到文件中,还可以对sys.stdout赋值为一个文件对象
f = open ('test.txt','w')
sys.stdout = f
print ('test')#会输出到test.txt
但是要明确的是,我们有理由去了解这些用法来拓宽视野,至于是否应该在程序中使用,我目前认为是多数时候都是不应该的(目前准大一0基础)
当不带任何参数时:
print()将产生空行
另外注意,在编程语言中,打印是一种跟随光标的行为。
光标在哪,就在哪开始打印
print('1 + 1 =',end ='')
print(' 2')
#将在一行输出
1 + 1 = 2
赋值语句
1.基本赋值语句:<variable> = <expr>
variable是标识符,expr是表达式
赋值语句的语义是:右侧的表达式被求值,然后产生的值与左侧命名的变量相关联
(关于求值,见于另一篇博客:标识符与表达式)
!!!注意,在python中 变量是于对象相关联的,而不是与内存位置相关联的。
值可以存放在内存中的任何位置,变量只是用于引用它们。
这有别于“”变量盒子的模型“”,当变量更改时,旧值被删除,新值被写入
内存地址属于变量(在声明中分配)这是C的特点
在python中一切皆对象,变量只负责引用,所以当变量更改时,变量指向新值,旧值会在程序空闲时被垃圾回收
2.赋值输入
<variable> = input(<ptompt>)
prompt == 提示词 接受一个字符串表达式
input()返回字符串
要得到数字可用eval(),该函数只接受字符串输入
<variable> = eval(input(<ptompt>))
eval == evaluate 求值
其作用类似于去掉引号
eval('ss')#这会显示ss未定义,因为去掉了引号
eval('11')#返回数字11
但是注意贸然使用eval()是有很大风险的:
我在input输入中键入print(‘ss’),将会控制程序输出ss,这称为代码注入攻击
为什么直接用eval(‘print(‘ss’)’)不行呢,我也想知道
同时赋值
<var1>,<var2>,... = <expr1>,<expr2>,...
因为是同时赋值,所以不用管该语句执行过程中各变量值的变化,只需取执行前一刻的变量值赋值即可
好处是可以轻而易举地完成变量间值的交换
而其他语言将必须引入第三变量
x,y = y,x
#等效于
z = x
x = y
y = z
这是python的优雅
你可以用类似代码在一次输入中对两个变量同时赋值:
score1,score2 = eval(input('Enter the scores separated by a comma: ')
赋字符串值是可以这样:
score1,score2 = input('Enter the scores separated by a comma: ').split(',')
对eval()的替换方法是直接指明要转换到的数据类型,而不是直接去除引号