查看原文
其他

Psychopy | 第2期:从Stroop看条件与循环

喵君姐姐 壹脑云科研圈 2022-10-07


Hello,
这里是行上行下,我是喵君姐姐~

最近在家实在无聊,所以只好安安心心学习啦。你最近在家干什么呢?

今天继续邀请阿槑给你带来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
条件分支结构的介绍

条件分支结构形式比较简单,基本形式为:


if <布尔表达式>: <代码段 | pass>


在这里,布尔表达式是一类只能以 True 或 False 为取值的代码,如 1==2;pass是一个占位符,表示“什么也不做”。

由于Python中的循环或分支不允许为空,所以需要使用pass占位;代码段 与 pass 有其中之一即可。
 
当我们看到 if 这个单词时,我们脑海中蹦出来的意思就是“如果”,同样的,在 Python 中,if 也可以简单地理解为“如果”的意思。

也就是说,当 if 后面的被满足时,则继续执行后面的代码,否则跳过这一代码。如:


a = 1 b = 2 if a < b: print('a<b')


此时我们可以看到结果如下:



而相反:


a = 2 b = 1 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') 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')

 

这样编写显得更为方便:


a = 0 if 1 < a < 5: print('wrong') else: print('right')


而当有两个及以上条件并列时,我们可以使用elif来进行并列,如:


a = 2 b = 1 if a < b: print('a<b') elif a == b: print('a==b') elif a > b: print('a>b')


同样的,最后的 elif a>b: 可以简写为 else:


a = 2 b = 1 if a < b: print('a<b') elif a == b: print('a==b') else: print('a>b')


在日常编写程序时,if 条件分支结构需要注意两个细节:

其一,对于每一个 if...: 的形式,最后的冒号往往容易忽略;

其二,Python 相较于其他编程语言最明显的特点在于其通过缩进来对代码段进行划分的。

也就是说,开头有缩进的代码表示这段代码是属于上面某个分支或循环,一个缩进是四个空格,可以单击 Tab 键来进行快速缩进。

 

Part3
两种循环结构的介绍

在 Python 中,循环有两种形式,一种是开篇代码中所展示的 for 循环,还有一种是 while 循环:

第一种是 for 循环,其基本形式为:


for <变量> in <序列>: <代码段 | pass>


其中,for循环可以遍历一个序列,如字符串、元组、列表等。

循环故名思意即重复,其运行就是重复执行一段代码,过程是:

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'

这样,我们便可以得到输出的结果:



在日常编写程序时,for循环同样需要注意冒号问题与缩进问题。

第二种循环是 while 循环,其基本形式为:


while <布尔表达式>: <代码段 | pass>


在 while 循环中,如果 while 后面的布尔表达式取值为 True ,则会不停运行该循环体(代码段),直到不再符合条件,如:


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,跳出循环,停止运行

此时输出:



break 同样可以用于 for 循环,例如:


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 语句。

与 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只会导致该次循环停止而不影响后续的循环

此时输出:



可以看到,在 continue 执行后,该次循环中止,但整个的while循环并未停止。
 
同样的对于 for 循环:


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:数据类型及运算符
非常时期专项调查 | 中国文化心理大调查第二期

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存