最近在家实在无聊,所以只好安安心心学习啦。你最近在家干什么呢?
今天继续邀请阿槑给你带来Psychopy系列教程,希望你会继续喜欢并且一直支持哟~
Part1 相关概念的简单引入
在之前几期,我们学习了
Psychopy的入门
以及数据类型与运算符
。今天,我们继续从Stroop范式来学习psychopy的条件与循环。
提到心理学行为实验,Stroop范式的影响与重要性不言而喻。
对于Stroop范式来说,我们需要控制呈现的条件、文字、颜色相互匹配,匹配方式如表所示:
我们可以利用条件分支与循环的结构来完成:
代码看起来有点复杂,我们现在分别来学习其中涉及的两种结构:条件分支与循环。list = ['red', 'blue']
for word in list:
for color in list:
if word == color:
condition = 'same'
else:
condition = 'diff'
print(condition, word, color)
Part2 条件分支结构的介绍
条件分支结构形式比较简单,基本形式为:
在这里,布尔表达式是一类只能以 True 或 False 为取值的代码,如 1==2;pass是一个占位符,表示“什么也不做”。if <布尔表达式>:
<代码段 | pass>
由于Python中的循环或分支不允许为空,所以需要使用pass占位;代码段 与 pass 有其中之一即可。 当我们看到 if 这个单词时,我们脑海中蹦出来的意思就是“如果”,同样的,在 Python 中,if 也可以简单地理解为“如果”的意思。
也就是说,当 if 后面的被满足时,则继续执行后面的代码,否则跳过这一代码。如:
此时我们可以看到结果如下: 而相反:a = 1
b = 2
if a < b:
print('a<b')
则 'a<b' 无法被输出。 条件分支结构除了像上述那样单独使用if外,对于相互并列的不同条件,我们使用可以if...elif...elif...else...来进行并列,具体来说: 当有两种互斥的条件时,可以使用 if...else...a = 2
b = 1
if a < b:
print('a<b')
此时运行我们可以得到:a = 2
b = 1
if a < b:
print('a<b')
else:
print('a>=b')
可以看到,在else后面的条件内容是被省略掉的。
在编写程序过程中,我们有时会遇到内容比较繁琐的条件,此时可以将内容简单的互斥条件放到if后,这样就可以省去繁琐的内容。
比如,当我们想使 a<=1 且 a>=5 时输出 ’right’,而其他情况输出 ’wrong’ 相比于:
a = 0
if a <= 1 and a >= 5:
print('right')
else:
print('wrong')
这样编写显得更为方便:
而当有两个及以上条件并列时,我们可以使用elif来进行并列,如:a = 0
if 1 < a < 5:
print('wrong')
else:
print('right')
同样的,最后的 elif a>b: 可以简写为 else:a = 2
b = 1
if a < b:
print('a<b')
elif a == b:
print('a==b')
elif a > b:
print('a>b')
在日常编写程序时,if 条件分支结构需要注意两个细节:a = 2
b = 1
if a < b:
print('a<b')
elif a == b:
print('a==b')
else:
print('a>b')
其一,对于每一个 if...: 的形式,最后的冒号往往容易忽略;
其二,Python 相较于其他编程语言最明显的特点在于其通过缩进来对代码段进行划分的。
也就是说,开头有缩进的代码表示这段代码是属于上面某个分支或循环,一个缩进是四个空格,可以单击 Tab 键来进行快速缩进。
Part3 两种循环结构的介绍
在 Python 中,循环有两种形式,一种是开篇代码中所展示的 for 循环,还有一种是 while 循环:
第一种是 for 循环,其基本形式为:
其中,for循环可以遍历一个序列,如字符串、元组、列表等。for <变量> in <序列>:
<代码段 | pass>
循环故名思意即重复,其运行就是重复执行一段代码,过程是:
1 从序列中取下一个值并赋值 2 执行一段代码 3 跳转至1,直到序列中没有下一个值
例如:
for i in ['a','b','c','d','e']:
print(i)
其执行过程为:
1 给 i 赋值 'a' 2 输出 i 也就是 'a' 3 重复第1步,赋值内容为 'b' 4 重复第2步,输出内容为 'b' …… 9 重复第1步,赋值内容为 'e' 10 重复第2步,输出内容为 'b'
这样,我们便可以得到输出的结果:
第二种循环是 while 循环,其基本形式为:
在 while 循环中,如果 while 后面的布尔表达式取值为 True ,则会不停运行该循环体(代码段),直到不再符合条件,如:while <布尔表达式>:
<代码段 | pass>
其执行过程为:a = 0
while a<2:
a+=1
print(a)
1 给 a 赋值 0 2 判断a<2为真,进入循环(a+1并输出) 3 此时a为1,重复第2步 4 此时a为2,重复第2步(判断a<2为假,退出循环) *如果while后的条件仍然为真,会一直运行直到该条件为假为止
这样我们就可以得到结果:
其运行过程为:a = 0
while a<2:
a+=1
print(a)
1 给 a 赋值 0 2 判断a<2为真,进入循环(a+1) 3 此时a为1,重复第2步 4 此时a为2,重复第2步(判断a<2为假,退出循环) 5 打印输出2 *打印输出的命令前无缩进,即不在while的代码段中,运行while代码段时其不运行
输出结果为:
会导致:a = 0
while a<2:
a+=1
print(a)
同时,在 while 循环使用的过程中如果编写不当会造成死循环问题:
while True:
<代码段 | pass>
此时 while 后面的内容一直为 True,如果不加以限制则会造成死循环(无限次执行代码段中的内容)。
而要避免死循环的发生,我们可以使用 break 语句跳出,如:
a = 0
while True:
a+=1
print(a)
if a == 2:
break
break 语句可以直接跳出循环使其停止,该例子运行过程为:
1 给 a 赋值 0 2 恒为True,进入循环(a+1并输出) 3 判断a==2为假(a为1,不进入条件) 3 重复第2步 4判断a==2为真 5 运行break,跳出循环,停止运行
此时输出:
执行过程为:for i in ['a','b','c','d','e']:
if i == 'c':
break
print(i)
1 给 i 赋值 'a' 2 判断i=='c'为假,不进入条件 3 输出 i 也就是 'a' 3 重复第1步,赋值内容为 'b' 4 重复第2,3步,输出内容为 'b' 5重复第1步,赋值内容为 'c' 6 重复第2步,判断i=='c'为真,运行break停止for循环并跳出 *输出在break之后,虽然i赋值为'c'的周期已经运行,但是break会导致循环从该处直接停止
此时输出:
与 break 语句不同,continue 语句只是中断当前一个循环,例如,对于 while 循环:
执行过程为:a = 0
while True:
a+=1
if a == 2:
continue
print(a)
if a == 4:
break
1 给 a 赋值 0 2 恒为True 3 执行+1,此时a为1 4 判断a==2为假,不进入条件 5 输出a(也就是1) 6 判断a==4为假,不进入条件 7 重复2,3,此时a为2 8 重复4,a==2为真 9 执行continue,该次循环中止 10 重复2,3,此时a为3 11重复4,a==2为假,不进入条件 12 输出a(也就是3) 13 重复6,a==4为假,不进入条件 14 重复2—6,a==4为真,执行break停止 *continue只会导致该次循环停止而不影响后续的循环
此时输出:
执行过程为:for i in ['a','b','c','d','e']:
if i == 'c':
continue
print(i)
1 给 i 赋值 'a' 2 判断i=='c'为假,不进入条件 3 输出 i 也就是 'a' 3 重复第1步,赋值内容为 'b' 4 重复第2,3步,输出内容为 'b' 5重复第1步,赋值内容为 'c' 6 重复第2步,判断i=='c'为真,运行continue停止该次循环并继续 7 重复1--3步 8 重复1—3步,所有元素循环完成,停止 此时输出:
Part4 Stroop代码详细讲解
list = ['red', 'blue']
for word in list:
for color in list:
if word == color:
condition = 'same'
else:
condition = 'diff'
print(condition, word, color)
其执行过程为:
1 给list赋值 2 执行第一个for 循环,即变量word赋值为'red' 3 执行第二个之后执行第一个for 循环,即变量color赋值为'red' 4 执行第二个循环下的代码,即条件分支结构以及打印输出 5 返回第3步并给变量color赋值为'green' 6 重新进行第4步(在word为'red'的条件下color的赋值完成) 7 返回第2步并给变量word赋值为'green' 8 继续执行第3,4,5,6步 9 得到结果 与开头的表格相同:
在嵌套的循环中,每多一级嵌套,对应的缩进也就多一级。
并且,只有当低一级的循环全部运行完成,高一级的循环才会进行下一步赋值,并重新开始低级循环的全部运行过程。
Part5 系列课程的总结
至此,我们已经学习了
Psychopy入门
、数据类型与运算符
、条件与循环。基本学完了 Python 在 Psychopy 中需要用到的大多数知识,虽然难度不是很大,但是比较繁杂,建议通过练习以熟悉这些基本的语句和方法。
如果想要了解其他有关 Python 的基础知识,也可以通过更多阅读的到达前几期的传送门来进行学习~
PS:后台回复关键词“psychopy第2期”即可获得所述的资料及代码啦! 作者:阿槑
排版:喵君姐姐
第0期:psychopy coder入门
中英文期刊分区介绍及查询方法
第1期 | psychopy:数据类型及运算符
非常时期专项调查 | 中国文化心理大调查第二期
网友评论