Python教学细节探讨

2018-09-22 04:15顾晓东付莹江苏第二师范学院
数码世界 2018年8期
关键词:沙盒参赛者列表

顾晓东 付莹 江苏第二师范学院

1 简介

高级脚本语言Python一直被认为是“终生受用的程序设计语言”,除了因为Python有非常完善的基础代码库、易于理解和学习、研究人员更容易做快速原型,它还拥有大量的第三方库。Python让专业人员主要考虑解决问题的方法,而不用考虑实现方案所需的技术。很多“一小时学python”的实践声称大多数没有任何程序设计基础的大一学生都可以在一小时内理解Python设计方法并具备十几行代码的编写能力[1]。然而笔者在教学过程中发现,情况并非如此。以下笔者先罗列了python语言的优缺点再以具体实例分析了python的优弱点和一些教学细节。

2 Python的优缺点

Python语言的定位是“优雅”、“明确”、“简单”,其显著的优点有:(1)对初学python的人来说,python非常适合阅读。python虽然是用c语言写的,但是它摈弃了c语言中复杂的指针,简化了语法。(2)Python是FLOSS(自由/开放源码软件)之一。简单地说,阅读者可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。(3)Python可以被移植在许多平台上。如果编程者小心地避免使用依赖于系统的特性,那么所有的Python程序无需修改就可以在下述任何平台上运行。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台!(4)Python既支持面向过程的函数编程也支持面向对象的抽象编程。在面向过程的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在面向对象的语言中,程序是由数据和功能组合而成的对象构建起来的。与C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。(5)python拥有的大量第三方库可以用来完成各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。

同时,Python的缺点有:(1)python的实现性能极低!大致和C相差五倍左右。如果是大规模计算,大致能差10倍以上。(2)python的底层设计相对混乱。(3)Python语言的自构建特性混乱。一般而言,高级语言都是使用C语言实现一个内核,由内核实现一些基础操作,再由基础操作实现更复杂的操作,各层的边界非常清晰。而python中库的相互依赖层级不清晰。(4)python的沙盒(sandbox)化难以保证本地效果/跨平台/安全性。当我们要写很多种程序时,python环境中的依赖势必越来越多。有时还会导致冲突的出现,python的沙盒环境VirtualEnv可以根据需要在一台机器上创建多个独立的Python虚拟运行环境,多个Python环境相互独立,互不影响。事实上,python的沙盒难以保证本地效果/跨平台/安全性。

3 python教学细节

3.1 LEGB规则

由于python的底层设计相对混乱,初学者往往要花很长时间来研究以下程序:

其原因在于:python在运行时变量的作用域查找顺序依次是:local(局部作用域),enclosing(函数范围作用域),global(全局作用域),build-in(内建对象作用域),简称LEGB(Local -Enclosed- Global - Built-in)规则。LEGB(Local -Enclosed - Global- Built-in)规则。程序在调用内部函数inner_fun()时输出3,返回主函数时,局部变量a被释放,全局变量a依然为2。在C语言 中,变量名是内存地址的别名,而在 Python 中,名字是一个字符串对象,它与它指向的对象构成一个{name : object}关联,Python 中name-object的关联存储在不同的作用域中,而各个不同的作用域是相互独立的。

3.2 Python的元编程

Type(name,bases,attrs) ,其中name为类名字符串,bases为父类元组,attrs为属性字典。元类是生成类的类,比类更抽象。元类定义的是类的方法,类定义的是实例方法。(如图1)。

图1 python中的元类

对一般的程序员来说,这种用一个类生成另一个类的写法相对难以理解。

3.3 Python的列表和c语言的数组:

相对于c语言的数组定义,python的列表无须预先分配大小,创建列表变量时不需要知道元素个数,可以在使用中动态插入任何数量的元素,且列表中不同元素的类型可以相同也可以不同。列表的概念为程序编写提供了很大的设计空间,同时也因为程序过于简洁使学生并没有理解程序的实质意义,陷入能看“懂”却不会编写的状态。以下是冒泡法的C程序和Python程序的比较。

可以看出,python程序异常简洁,但理顺算法的实现却不容易,相比C程序缺少了数据元素的交换细节。

再以经典的羊车门问题的python程序为例:有三扇关闭的门,一扇门后面停着汽车。其余门后是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门,在开启它之前,主持人会开启另外一扇门露出门后的山羊,然后允许参赛者更改自己的选择。请问:参赛者更换选择能否增加猜中汽车的机会?

图2 羊车门问题的python程序

程序使用random库生成随机数,但更改选择相对不更改选择的随机数列表少了首次选择的门和主持人打开的门。由以上程序也可以看出列表的概念使得python程序异常简洁,常常学生觉得程序简单,可上手编写时却无从下手。笔者在教学中常采用比较python程序和c程序的方式,使学生能进一步理解程序的细节,取得了良好的教学效果。

4 结论

Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。笔者在教学中发现虽然其适合阅读但难以编写。本文以具体实例分析了python的优弱点和教学中的一些细节,对python的教学有一定的指导意义。

猜你喜欢
沙盒参赛者列表
不好惹的沙盒树
学习运用列表法
金融创新产品—监管沙盒
用软件处理Windows沙盒配置文件
扩列吧
劝退马拉松参赛者
害我受伤的小石头
Windows 10“沙盒” 不仅更安全
列表画树状图各有所长
2011年《小说月刊》转载列表