10

Python编程思想(2):Python主要特性、命名规则与代码缩进

 3 years ago
source link: https://www.cnblogs.com/nokiaguy/p/13035203.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Python编程思想(2):Python主要特性、命名规则与代码缩进

在正式学习Python语言之前,我们先来了解一下Python有哪些特性,以及Python的基本语法结构是怎样的。
有很多同学问,Python语言到底能做什么呢?我的回答是:Python几乎什么都能做,包括移动、GUI、Web、数据分析,更是数据挖掘、机器学习、深度学习等技术的首选语言。
基于 Python 的包更是不胜枚举,“Tiobe 编程语言排行榜”最新统计显示 Python 是增长最快的语言。
32818-20200603082345684-221791807.png
这得益于 Python 语言语法简单、开发效率高,集成系统非常方便。Python 相关的就业机会也是非常多,待遇也很优厚。因此,不管从易用性,还是工作机会和待遇来说,Python 都是 IT 从业者需要掌握的语言。
现在先让我来问大家一个问题,Python到底是怎样一种编程语言呢?
要回答这个问题,首先需要介绍一下Python的量大特性:动态语言和弱类型。
那么什么是动态语言呢?
要了解什么是动态语言,要首先了解“类型检查”。类型检查是验证类型约束的过程,编译器或解释器通常在编译阶段或运行阶段做类型检查。
类型检查就是查看“变量”和它们的”类型”,然后判断表达式是否合理。例如,不能拿一个 string 类型变量除以浮点数变量。
如果类型检查发生在程序运行阶段,那么它便是“动态类型语言”。常见的动态语言包括:
  • Python
  • JavaScrpit
类型检查发生在“编译阶段”的是“静态类型语言”。常见的静态类型语言包括:
  • Swift
  • Kotlin
  • 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年,由于语言升级,所以变成了强类型语言。
现在可以总结一下:
常用的强类型编程语言如下:
Swift
Kotlin
常用的弱类型编程语言如下:
Python
JavaScript
下面看一下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的流行。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK