在正式学习Python语言之前,我们先来了解一下Python有哪些特性,以及Python的基本语法结构是怎样的。
有很多同学问,Python语言到底能做什么呢?我的回答是:Python几乎什么都能做,包括移动、GUI、Web、数据分析,更是数据挖掘、机器学习、深度学习等技术的首选语言。
基于 Python 的包更是不胜枚举,“Tiobe 编程语言排行榜”最新统计显示 Python 是增长最快的语言。
这得益于 Python 语言语法简单、开发效率高,集成系统非常方便。Python 相关的就业机会也是非常多,待遇也很优厚。因此,不管从易用性,还是工作机会和待遇来说,Python 都是 IT 从业者需要掌握的语言。
现在先让我来问大家一个问题,Python到底是怎样一种编程语言呢?
要回答这个问题,首先需要介绍一下Python的量大特性:动态语言和弱类型。
那么什么是动态语言呢?
要了解什么是动态语言,要首先了解“类型检查”。类型检查是验证类型约束的过程,编译器或解释器通常在编译阶段或运行阶段做类型检查。
类型检查就是查看“变量”和它们的”类型”,然后判断表达式是否合理。例如,不能拿一个 string 类型变量除以浮点数变量。
如果类型检查发生在程序运行阶段,那么它便是“动态类型语言”。常见的动态语言包括:
- Python
- JavaScrpit
- PHP
类型检查发生在“编译阶段”的是“静态类型语言”。常见的静态类型语言包括:
- C
- C++
- Java
- Swift
- Kotlin
- C#
- Scala
现在明白了吧,Python属于动态类型语言,也就是说,Python中的数据类型在编译时是不检查的,只有在运行时才会检查。这么做的好处是在定义变量时可以不事先指定数据类型,或者随便喂变量指定一个值,反正后期还可以变。但坏处也显而易见,尽管动态类型带来了遍历,但同时也带来了麻烦。由于变量的数据类型是不确定的,所以就会导致在任何时候,变量可能是任何的数据类型。这样就会造成一个问题。我们就无法准确的得到变量内部的成员。例如。变量的初始类型是一个类。如果编程语言是静态类型的,那么就意味着这个变量的类型永远不可能变,所以我们可以准确地得知这个变量所对应的这个类里面的成员,比如说这个类中有什么方法,有什么属性。但是如果这种语言是动态类型的。那么就意味着这个变量有可能会变成其他的数据类型,比如说,变量可能会变成int类型。如果是这样的话,我们就没有办法准确地得知这个变量所对应的类型中的成员。这也是为什么现在几乎所有的支持动态语言的IDE的用户体验都不如支持静态语言IDE的原因。
那么什么是弱类型语言和强类型语言呢?
如果用一句话定义,这句话就是:变量的数据类型一旦被指定,就永远不会变化,这种语言就称为强类型语言。反之。如果变量的数据类型被指定,后期还可以改变这个变量的数据类型,那么这种语言就称为弱类型语言。
根据这个定义。Python很明显是一种弱类型语言,因为在任何时候都可以为Python变量赋任何类型的值。例如,
x = 20 # 整数类型 x = 'hello' # 字符串类型 x = 20.12 # 浮点类型 x = True # 布尔类型
在上面的4行代码中,变量x改变了4次数据类型,首先为x赋值为20,在定义x变量的同时,将x变量的数据类型设置为整数类型,然后分别将x的数据类型设为字符串、浮点和布尔类型。任何可以实现这种效果的编程语言都是弱类型语言。
这里可能会有如下两个误解:
1. 有很多编程语言,如Java、Swift、Dart等,都至少有一种数据类型,是所有数据类型的根,如Java中的Object、Swift中的Any、Dart中的dynamic,如果变量声明为这些数据类型,同样可以设置任何,从表面上看,与动态类型语言的效果类似,不过这些语言仍然是强类型语言,因为变量的类型并没有改变,只是变量的类型允许设置任何类型的值,因为这些数据类型是一切类型的根类型。
2. 有很多资料和书将Python说成是强类型语言,理由是不能与其他数据类型在计算表达式中混合使用。例如,在Python语言中有两个变量x和y,x是字符串类型,y是整数类型。x和y不能直接相加,而需要将x转换为整数类型,或者将y转换为字符串类型。其实这么理解是完全错误的,因为这是一个语义的规则。
我们不妨做个假设,假设一种编程语言如果是弱类型或强类型,那将永远是弱类型和强类型语言。如果这个假设成立,那么未来的Python版本有可能可以让x和y相加,只要规定数据类型的优先级即可,也就是说,如果两个完全不同的数据类型的值相加,以谁为主,这里姑且规定,String类型在所有内建数据(int、float、bool等)类型中的优先级最高,那么x + y,其实会自动将y转换为字符串,然后再和x连接。这种语言的改进完全有可能。
那可能有的同学会问,这么改进,不会让大量已经存在的Python程序出问题吗?如果只是这种改进,当然不会有任何问题。因为x + y只有如下3种可能:
1. 直接写成x + y,这种可能会导致程序出错,所以程序员会避免这种写法
2. 将y转换为字符串类型,这总情况与支持不同类型相加的Python版本的功能吻合,所以不会出现问题
3. 将x转换为整数,再与y相加,其实这就成了两个整数相加了,也不会有问题;
所以不管是哪种可能,都不会对原来的程序产生任何影响。如果Python的未来版本做了这种改变,那么就意味着Python就变成了一种弱类型变成。这与前面的假设相悖。
那么可能有的同学会问,难道Python的未来版本就不能对变量数据类型变化规则作出改变吗?也就是说,一旦变量的数据类型确定以后,就不能再改变。这么做,从技术上当然是没有问题。但这是一个编程语言的变化禁区。因为一旦这么变化,那么现存的Python程序真的会出问题。还是用上面的代码,这么变化的后果就意味着后3行代码将全部出错。所以对于编程语言的改进,并不是随意的,否则会造成很大的麻烦。因此,定义什么是弱类型或强类型语言,一定要在编程语言几乎不可能改变的特性上,如果变量数据类型的变化规则,这样才会符合前面的假设。当然,你可以假设编程语言的这个特性是随时可以变化的,例如,2012年的时候,是弱类型,在2016年,由于语言升级,所以变成了强类型语言。
现在可以总结一下:
常用的强类型编程语言如下:
C
C++
Java
C#
Swift
Kotlin
Dart
常用的弱类型编程语言如下:
Python
JavaScript
PHP
下面看一下Python不同于其他大多数编程语言的规则。
1. 命名规则
首先说明一点,命名规则并不是强制的,这只是约定,你可以不遵守,也可以指定团队自己使用的命名规则,但最好团队所有的成员使用同一的规则。下面列出的只是一种普通采用的规则,也是大多数Python程序库采用的规则。
- 标识符允许使用英文、数组和下划线,但不能以数字开头,这一点和其他编程语言相同;
- Python是大小写敏感的编程语言,所以test和Test表示不同的含义;
- 变量名用小写形式,如value、test、hello等。如果变量名包含多个单词,那么中间用下划线分隔,如my_value、product_name等;
- 方法名与变量名的命名规则相同,如get_value(),set_my_value(...);
- 常量中所有的英文字母要大写,如果包含多个单词,中间用下划线分隔,如PI、PRODUCT_PRICE等;PS:在Python中并没有常量,但可以将变量当做常量使用;
- 类名采用大驼峰命名法,也就是每一个单词的首字母都要大写,如MyClass、Product、NewForum等;
- 如果类中的变量以单下划线(_)开头,如_value,是受保护变量,相当于Java中的protected,按官方描述是只能由本身或子类访问,但经过测试,外部也可以访问被声明为protected的变量,可能是Python解析器并没有做这样的限制;
- 如果类中的变量以双下划线(__)开头,如__value,是private类型的变量,只允许自身访问;
2. 缩进原则
这是Python与任何其他编程语言都不同的地方。其他的编程语言都是通过大括号来指定代码块的,而Python是通过缩进来指定代码块的。代码块的缩进可以任意,但同一个代码块中的每一行代码的缩进必须一致。
下面的代码定义了一个类Product,该类包括一个构造方法和一个普通方法,以及一个普通的类变量。后面的代码创建了Product对象,并调用了get_name方法。该例包含了类作用域和方法作用域,作用域以冒号(:)开头,后面作用域中的代码的缩进要一致,否则程序会报错。关于类的详细解释,会在后面的文章中详细讲解。
class Product: name = "iPhone" def __init__(self, name): self.name = name def get_name(self): return self.name product = Product("特斯拉") print(product.get_name())
其实我一开始学Python时,就感觉这个用缩进确定代码块的方式很别扭,因为一旦代码的缩进弄乱了,就很难调整回来,这不像用一对花括号,只要在花括号之间的肯定属于同一个作用域。如果既然Python这么用了,就只能接受了。据我所知,数百种编程语言,好像只有Python是这么做的。不过由于Python的其他特性非常吸引人,所以这点小瑕疵并不影响Python的流行。