Python 与 SPSS 语法的主要区别
作者:Ruben Geert van den Berg,来自 SPSS Python 基础
- Python 完全区分大小写
- 检查 Python 中的对象类型
- Python 中缩进很重要
- Python 赋值或比较运算符
- SPSS 和 Python 中的转义序列
- SPSS 和 Python 中的注释
Python 完全区分大小写
有经验的 SPSS 用户可能知道,SPSS 语法在很大程度上不区分大小写:无论您使用小写、大写还是混合大小写编写语法,通常都没有关系。例如,以下 FREQUENCIES 命令都是等效的。
***SPSS 语法在很大程度上不区分大小写。**
FREQUENCIES V01 TO V10.
frequencies v01 to v10.
fReQuEnCiEs v01 tO V10.
相比之下,Python 完全区分大小写。因此,您始终需要在 Python 中使用_完全_正确的大小写,否则可能会触发各种错误和警告。
***PYTHON 完全区分大小写。**
begin program python3.
myName = 'Ruben'
print(myName) # Ruben
print(myname) # [...] NameError: name 'myname' is not defined
end program.
请注意,您还需要在 Python 中为 SPSS 变量名使用正确的大小写。避免对 SPSS 变量名全部使用大写往往可以简化事情。
检查 Python 中的对象类型
在 SPSS 中,“数据类型”主要指的是变量类型。请记住,SPSS 中的“变量”是包含数据值的单元格列。只有 2 种 SPSS 变量类型:
- 数值变量
- SPSS 字符串变量
这 2 种类型决定了您可以在 SPSS 中对变量执行(或不执行)的操作。容易混淆的是,变量视图中的“类型 (Type)”列表明存在更多变量类型,但这些是_格式 (formats)_,而不是类型,如SPSS 变量类型和格式中所述。
在 Python 中,我们也会遇到字符串和数字,但这些被称为对象 (objects) 而不是变量,并且仅保存单个值。一整_列_值通常表示为 Python 列表 (list) 对象或 Python 元组 (tuple)。这些是与它们可能包含的字符串或整数不同的对象类型。
因此,存在许多不同的 Python 对象类型,我们在 Python 对象类型快速概览 中简要介绍。与 SPSS 变量类型一样,Python 对象类型决定了您可以对它们执行(或不执行)的操作以及如何执行。这就是为什么您有时需要检查您正在处理的对象类型。只需使用 print(type(myObject))
即可完成此操作,如下所示。
***查找您正在处理的对象类型。**
begin program python3.
myName = 'Ruben'
print(type(myName)) # <class 'str'>
end program.
注意:Python 用户可以创建称为类 (Classes) 的新对象类型。此类通常有自己的方法 (methods) 和属性 (properties)。您可能需要进行一些学习才能处理其中的一些类。
Python 中缩进很重要
SPSS 中的基本循环使用以下命令完成:
DO REPEAT
或LOOP
命令,指示某个循环的开始;- 我们将循环遍历的 1 个或多个 SPSS 转换命令;
END REPEAT
或END LOOP
命令,用于结束某个循环。
以下语法简要说明了此结构。
***SPSS DO REPEAT 示例。**
do repeat #vars = v01 to v05.
compute #vars = 0.
end repeat.
在 Python 中,循环的开始由 for
或 while
语句指示。之后,后续行的缩进指示循环的结束位置。以下示例说明了其工作原理。
***循环遍历 2 个 PRINT 语句。**
begin program python3.
for ind in range(10):
print('COMPUTE V{} = {}.'.format(ind,ind))
print("VARIABLE LABELS V{} 'Mean Job Satisfaction Score'.".format(ind))
end program.
***循环遍历 1 个 PRINT 语句。**
begin program python3.
for ind in range(10):
print('COMPUTE V{} = {}.'.format(ind,ind))
print("VARIABLE LABELS V{} 'Mean Job Satisfaction Score'.".format(ind))
end program.
这意味着,为了使您的 Python 代码正常运行,您必须应用正确的缩进级别。这适用于:
- Python
for
循环; - Python
while
循环; - Python
if
结构,可能包括elif
和/或else
; - Python try-except 结构。
请注意,我们将在 Python 中的条件和循环 中介绍其中的大多数内容。
Python 赋值或比较运算符
在 SPSS 语法中,=
运算符用于:
- 将值或函数分配给某个变量,如
COMPUTE
或 IF 中那样; - 比较变量/值与另一个变量/值。
以下语法显示了 2 个最小示例。
***在 SPSS 中使用 = 进行赋值。**
compute m01 = mean(v01 to v05).
***在 SPSS 中使用 = 进行比较。**
do if (gender = 0).
...
end if.
相比之下,Python 使用:
=
用于将值分配给某个对象;==
用于将对象/值与另一个对象/值进行比较。
以下示例简要说明了差异。
***= 与 == 的区别。**
begin program python3.
myAction = 'PRINT' # = 将值分配给对象
if myAction == 'PRINT': # == 比较值
print('FREQUENCIES ALL.')
end program.
有关这些运算符和许多其他 Python 运算符的概述,请阅读 Python 运算符 - 快速概览和示例。
SPSS 和 Python 中的转义序列
在 SPSS 中,我们很少使用转义序列,但 2 个主要例外是:
- 通过加倍来转义值/变量标签中的单引号;
- 在变量和值标签中使用
\n
使它们分为 2 行或更多行。
很少有 SPSS 用户知道这样的转义序列,但运行以下语法可以很好地说明这两者。
***设置空数据。**
data list free/v01.
begin data.
6
end data.
***通过加倍来转义单引号。**
add value labels v01 6 'Don''t know'.
***使用反斜杠转义 "n"。**
variable labels v01 'This label continues on\nline 2 and\nline 3'.
***在后续的输出表中显示标签。**
set tnumbers both tvars both.
***快速检查。**
frequencies v01.
结果
因此,这些是 SPSS 语法中的基本转义序列。那么,Python 呢?
在 Python 中,始终使用反斜杠进行转义。反斜杠本身也由反斜杠转义。或者,通过在字符串前加上“r”将其指定为原始字符串 (raw string)。以下语法显示了一些基本示例。
***使用反斜杠转义单引号。**
begin program python3.
vallab = 'Don\'t know'
print(vallab)
end program.
***使用反斜杠转义反斜杠。**
begin program python3.
rDir = 'D:\\analyses_example\\\new-data'
print(rDir)
end program.
***通过原始字符串转义反斜杠。**
begin program python3.
rDir = r'D:\analyses_example\new-data'
print(rDir)
end program.
SPSS 和 Python 中的注释
在 SPSS 中,我们通常通过以下方式注释整行语法:
- 以星号开始某一行;
- 以句点结束该行。
在极少数情况下,我们可能会在由 /*
和 */
括起来的某个命令_内_输入注释,如下所示。
***此整行是 SPSS 语法中的注释。**
frequencies all /* AND HERE'S A COMMENT WITHIN A COMMAND */
/barchart.
在 Python 中,井号 (#
) 与它所在行的末尾之间的所有内容都是注释。或者,用三引号括起来(多行)注释。
***从 # 到行尾是 PYTHON 注释。**
begin program python3.
#FIRST GREET AUDIENCE BEFORE PROCEEDING
print('Hello!') #DONE
end program.
***三单引号之间的 PYTHON 注释。**
begin program python3.
'''
This is a multiline
comment enclosed by
triple single quotes.
'''
print('Hello!')
end program.