Python<5>赋值、表达式、打印语句

赋值语句

绝大多数的赋值语句都很简单,但有些特性要专门记住:

<1>赋值语句建立对象引用值

Python赋值语句会把对象引用值存储在变量名或者数据结构的元素内。赋值语句总是建立对象的引用值,而不是

复制对象,因此Python变量更像是指针,而不是数据存储区域。

<2>变量名会在首次赋值时被创建

一旦赋值了,每当这个变量名出现在表达式时就会被其所引用的值取代。

<3>变量名在引用前必须先赋值

否则可能发生异常

<4>执行隐式赋值时的一些操作

所有的赋值环境都是运行时把变量名和对象的引用值绑定起来。

 

常用赋值语句

<1>spam = 'Spam'                  #基本形式

<2>spam,ham = 'yum','YUM'           #元组赋值

<3>[spam,ham] = 'yum','YUM'          #列表赋值

<4>a,b,c,d = 'spam'                 #序列赋值

<5>spam = ham = 'spam'              #多目标赋值

<6>spam = spam + N                 #增强型赋值

 

 

 

常用表达式语句

foo(x,y)       #函数调用

foo.f(x)       #方法调用

var           #直接打印变量值

 

表达式语句通常用于执行可于原处修改的方法

若使用L=L.append(1) 则L为None

 

 

 

打印操作

打印操作在2.x和3.x的python版本差异很大,导致不修改就没法使用。

在2.x中 打印是语句拥有自己特定的语法

在3.x中 打印是个内置函数,用关键字参数来表示特定模式

 

3.0的print函数

print([object,...][,sep=''][,end='\n'][,file=sys.stdout])

其中方括号里的项是可选的,并且'='后面的值都有默认值。这个内置函数把字符串sep所分开的一个或多个

对象的文本表示,后面都跟着end,打印到file流中。其中,

 

sep是在每个对象的文本之间插入的一个字符串,如果没有传递的话,默认是一个空格。

x=1 y=2 z=3

print(x,y,z) -> 1 2 3        #sep间隔默认为一个空格

print(x,y,z,sep='')  -> 123   #sep用空字符串替代 对象之间没空格

 

end是打印文本末尾的一个字符串,默认是一个\n。 

print(x,y,z,end='') ->1 2 3                  #打印完之后end为空字符串 不会到下一行

print(x,y,z,end='');print(x,y,z) -> 1 2 31 2 3  #于是紧接着上一次打印完的下一个继续打印

 

file指定文本将要发送到的文件,默认是sys.stdout,会显示在屏幕上。

print(x,y,z,file=open('test.txt','w'))    #写入test.txt

print(open('test.txt').read())

1 2 3

 

也可以修改sys.stdout的值赋值文件流进行重定向

import sys

sys.stdout = open('log.txt','a')

重设之后程序中任何地方的print语句都会写到log.txt的末尾。默认的print语句只是传送文本给sys.stdout.write

方法。

 

 

 

 

 

参考<<learning python>>

 

 

 

好的,我可以帮你构造递归下降分析程序。根据上述BNF文法,我们可以将其转换为如下的语法规则: ``` <程序> -> "problem" <标识符> ":" <程序体> "." <程序体> -> "begin" <语句串> "end" <语句串> -> <语句> { ";" <语句> } <语句> -> <赋值语句> | <条件语句> | <循环语句> <赋值语句> -> <变量> "=" <表达式> <条件语句> -> "if" <表达式> "then" <语句> "else" <语句> <循环语句> -> "while" <表达式> "do" <语句> <表达式> -> <项> { ("+" | "-") <项> } <项> -> <因子> { ("*" | "/") <因子> } <因子> -> <无符号常量> | <变量> | "(" <表达式> ")" <变量> -> <标识符> <标识符> -> 字母 { 字母 | 数字 } <无符号常量> -> 数字 { 数字 } ``` 接下来,我们按照递归下降分析的方法,分别对每个非终结符编写一个函数。具体实现如下: ```python # 定义全局变量 pos = 0 # 记录当前处理到的位置 text = "" # 记录要分析的文本 def match(expected): """匹配终结符""" global pos if pos < len(text) and text[pos] == expected: pos += 1 else: raise Exception("Syntax Error: expected {} but got {}".format(expected, text[pos])) def is_alpha(ch): """判断是否为字母""" return ch.isalpha() def is_digit(ch): """判断是否为数字""" return ch.isdigit() def program(): """处理 <程序>""" match("problem") identifier() match(":") program_body() match(".") def program_body(): """处理 <程序体>""" match("begin") statement_list() match("end") def statement_list(): """处理 <语句串>""" statement() while pos < len(text) and text[pos] == ";": match(";") statement() def statement(): """处理 <语句>""" if text[pos] == "if": conditional_statement() elif text[pos] == "while": loop_statement() else: assignment_statement() def assignment_statement(): """处理 <赋值语句>""" variable() match("=") expression() def conditional_statement(): """处理 <条件语句>""" match("if") expression() match("then") statement() match("else") statement() def loop_statement(): """处理 <循环语句>""" match("while") expression() match("do") statement() def expression(): """处理 <表达式>""" term() while pos < len(text) and text[pos] in ("+", "-"): if text[pos] == "+": match("+") else: match("-") term() def term(): """处理 <项>""" factor() while pos < len(text) and text[pos] in ("*", "/"): if text[pos] == "*": match("*") else: match("/") factor() def factor(): """处理 <因子>""" if is_digit(text[pos]): unsigned_constant() elif text[pos] == "(": match("(") expression() match(")") else: variable() def variable(): """处理 <变量>""" identifier() def identifier(): """处理 <标识符>""" if not is_alpha(text[pos]): raise Exception("Syntax Error: expected an alphabet but got {}".format(text[pos])) pos += 1 while pos < len(text) and (is_alpha(text[pos]) or is_digit(text[pos])): pos += 1 def unsigned_constant(): """处理 <无符号常量>""" if not is_digit(text[pos]): raise Exception("Syntax Error: expected a digit but got {}".format(text[pos])) pos += 1 while pos < len(text) and is_digit(text[pos]): pos += 1 def parse(input_text): """解析输入文本""" global pos, text pos = 0 text = input_text program() if pos == len(text): print("Parsing Succeeded") else: raise Exception("Syntax Error: unexpected end of input") ``` 在上述代码中,我们定义了全局变量 `pos` 和 `text`,分别表示当前处理到的位置和要分析的文本。然后,我们编写了每个非终结符对应的函数,如 `program()`、`program_body()`、`statement_list()` 等。 在每个函数中,我们使用了递归的方法,不断调用其他函数,处理重复出现的子表达式。 最后,我们编写了一个 `parse()` 函数,用来解析输入文本。在解析过程中,我们首先调用 `program()` 函数,然后检查是否已经处理完了整个输入文本。 使用时,只需要调用 `parse()` 函数,传入要分析的文本即可。例如,对于输入文本: ``` problem example: begin x = 2 * (3 + y) / 4; if x > 0 then y = 2; else y = 3; while y < 10 do y = y + 1; end end. ``` 我们可以这样调用: ```python parse("""problem example: begin x = 2 * (3 + y) / 4; if x > 0 then y = 2; else y = 3; while y < 10 do y = y + 1; end end.""") ``` 程序将会输出 `"Parsing Succeeded"`,表示分析成功。如果输入的文本不符合语法规则,则会抛出异常,给出相应的错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值