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 变量类型:

这 2 种类型决定了您可以在 SPSS 中对变量执行(或不执行)的操作。容易混淆的是,变量视图中的“类型 (Type)”列表明存在更多变量类型,但这些是_格式 (formats)_,而不是类型,如SPSS 变量类型和格式中所述。

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 REPEATLOOP 命令,指示某个循环的开始;
  • 我们将循环遍历的 1 个或多个 SPSS 转换命令;
  • END REPEATEND LOOP 命令,用于结束某个循环。

以下语法简要说明了此结构。

***SPSS DO REPEAT 示例。**

do repeat #vars = v01 to v05.
compute #vars = 0.
end repeat.

在 Python 中,循环的开始由 forwhile 语句指示。之后,后续行的缩进指示循环的结束位置。以下示例说明了其工作原理。

***循环遍历 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 语法中,= 运算符用于:

  • 将值或函数分配给某个变量,如 COMPUTEIF 中那样;
  • 比较变量/值与另一个变量/值。

以下语法显示了 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 输出表中的转义序列

因此,这些是 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.