写点什么

1. Python 的特性和语法

作者:Hivan
  • 2023-08-05
    上海
  • 本文字数:4463 字

    阅读完需:约 15 分钟

千里之行始于足下。


大家好,我是茶桁,这里是我们《AI 秘籍》的第一节,让我们先从 Python 来开始好好的打好基础。


第一堂课,我们先从最基础的 Python 特性开始,当然,还有一些基本语法。


上来就开始讲特性和语法,说明我们将会遗弃惯用的“环境搭建”等更基础的内容,那些内容网上已经很丰富了,一查一大堆,并且相对来说内容都比较独立,所以希望还不太会搭建开发环境的同学可以自己去搜索看看。或者,其实从我这篇《Apple M1的AI环境搭建》也能完全搭建起一个完整的 Python 开发环境。(Windows 和 Linux 的同学就只能在网上搜索一下看看了。)


总体来说,Python 语言的使用率越来越高,它不仅可以用于 GUI 开发、Web 开发,还能进行数据预处理、数据探索性分析(EDA),更是进行数据挖掘、机器学习、深度学习等任务的首选语言。


基于 Python 的包也越来越丰富,各种优秀的库层出不穷。根据"Tiobe 编程语言排行榜"的最新统计,Python 结束了自己攀爬的势头,已经开始长期占据榜首。Python 的发展势头让人们看到了它在各个领域都有着广阔的应用前景。



得益于 Python 语言的简洁语法和高效开发能力,使得集成系统变得非常方便。


与此同时,Python 相关的就业机会也非常丰富,待遇也相当优渥。


因此,无论从易用性、就业机会还是薪酬待遇来看,Python 都是 IT 从业者必备的编程语言之一。

课程说明

  1. 本课程所使用语言为 Python3

  2. 本课程将会有一些案例,用于辅助学习和理解知识点。

  3. 基本所有案例均使用 Jupyter Notebook 做演示

  4. 一些项目会用到软件工程和设计模式的思想。

  5. 本课程无任何文学色彩,重点在于简单通俗易懂。


接下来,让我们真实开始吧。

Python 的两大特性

一句话总结,就是 Python 是一门动态的、强类型语言。

动态语言

在了解“动态语言”之前,我们先来了解一下“类型检查”。


类型检查是验证变量或表达式的数据类型是否符合语言规定的类型约束的过程。它用于确保程序在运行时不会出现类型错误,例如将一个字符串与一个整数相加或将一个数字与一个布尔值进行比较。类型检查旨在捕捉潜在的类型不匹配错误,并在编译时或运行时提供相应的警告或错误信息。


如果类型检查发生在程序运行阶段(运行时),则称为"动态类型语言"(dynamically typed languages)。常见的动态语言包括:


  • Python

  • JavaScript

  • Ruby

  • PHP

  • Lua

  • Perl

  • Shell 脚本


有动态语言,则必然会有其相对的“静态语言”,常见的“静态类语言”包含:


  • C

  • C++

  • Java

  • C#

  • Swift

  • Kotlin

  • Rust

  • TypeScript


当然,这些都只是一部分常见的动态语言和静态类型语言,还有许多其他编程语言也属于这两个类别。在实际开发中,选择使用动态语言还是静态类型语言取决于项目的需求、开发团队的喜好和项目的规模等因素。每种类型的语言都有其独特的特点和适用场景,因此选择合适的语言是非常重要的。

强类型语言

强类型语言(Strongly Typed Language)要求在编程过程中严格定义和遵守数据类型规则。在强类型语言中,变量必须明确地声明其数据类型,并且在运行时不能隐式地改变数据类型。这意味着变量在使用之前必须进行类型转换,以确保数据的一致性和安全性。


在强类型语言中,编译器或解释器会对数据类型进行严格的检查,如果发现不符合类型规则的操作,就会报错并拒绝执行。这样可以防止一些潜在的类型错误,确保程序的稳定性和正确性。


强类型语言的主要特点包括:


  1. 静态类型检查:在编译时或解释时进行类型检查,检查数据类型是否匹配,避免类型不匹配的错误。

  2. 显式类型转换:在进行类型转换时,必须显式地指定转换的方式,例如强制类型转换。

  3. 不支持隐式类型转换:强类型语言不允许在不明确声明的情况下将一个数据类型隐式地转换为另一个数据类型。


这么说可能并不直接,我们来拿个示例,我们输入两行代码:


a = 5a = a + 's'
复制代码


然后我们会看到程序抛出 TypeError 异常:



这个异常意思是不支持int变量str变量相加。


常见的强类型语言包括:


  • Java

  • C++

  • C#

  • Python

  • Swift

  • Kotlin

  • TypeScript

  • Rust

  • Pascal

  • Ada

  • Delphi


一样的,对应的就是弱类型语言。弱类型语言容易与其他类型混合计算,其代表是 JavaScript。(有一说一,我还挺喜欢 JS 的这个特性的)



弱类型语言包括:


  • JavaScript

  • PHP

  • Perl

  • Ruby

  • Tcl

  • Bash

  • AWK

  • MATLAB (在一些操作上可以被视为弱类型)


当然,对于这个划分其实并不是所有人都一致的,有些人还是会把 Python 归结为弱类型语言,而通常意义上,大家会把 C++划分到弱类型。这里我们不去争论,仅仅记住动态/静态、弱类型/强类型的区别就行了。

基本语法

基本语法里,我们介绍一下 Python 的命名规则、缩进原则、特殊关键字和特殊运算符四个方面。

命名规则

Python 的变量命名规则包括以下几条:


  1. 允许包括英文、数字以及下划线(_),不能以数字开头。

  2. 名称区分大小写,例如"myVar"和"myvar"是两个不同的变量。

  3. 以单下划线(_)开头的变量通常用作受保护的变量,表示应该将其视为私有,不建议直接访问。虽然 Python 没有严格的访问控制,但这是一种约定俗成的做法。

  4. 以双下划线(__)开头和结尾的变量是 Python 中的特殊标识符,具有特殊的意义,如类的私有成员或专用标识符。


Python 的变量命名习惯一般遵守蛇形命名法(snake case):


  1. 一般变量命名使用小写字母,多个单词之间用下划线连接,例如:book_id、book_store_count。

  2. 类名首字母大写,如 Python 内置模块 collections.abc 中的 Iterable 类,我们自定义的 Book 类等。

  3. 类方法名也使用小写字母,多个单词之间用下划线连接,例如:get_store_count()。


与 Java 的命名方法不同,Java 通常使用驼峰命名法(camel case)来命名变量和方法名,其中第一个单词首字母小写,后续单词首字母大写,例如:myVar、getStoreCount()。而 Python 则更倾向于使用蛇形命名法。这是因为 Python 社区普遍认可了蛇形命名法,使得代码在风格上更加一致和易读。

缩进原则

Python 最具特色的特点之一是使用缩进来表示代码的逻辑层次,而不是像 Java 和 C++中使用{}。Python 的缩进层级结构非常重要,它代表着代码的逻辑结构。


通常情况下,Python 的缩进为 4 个空格字符。例如,在定义一个 Book 类并重写__add__方法来计算两本书的库存量时,代码如下所示:


class Book(object):        # 定义类的参数    def __init__(self, b_id, b_name, b_store_count):        self.b_id = b_id        self.b_name = b_name        self.b_store_count = b_store_count
# 重写加法操作 def __add__(self, book): return self.b_store_count + book.b_store_count # 创建两个Book类的实例python_intro_book = Book(1, '金瓶梅', 100)ml_intro_book = Book(2, '玉蒲团', 200)
# 求两本书的总销量sales_cnt = python_intro_book + ml_intro_bookprint(sales_cnt)
复制代码


上述代码定义了一个 Book 类,包括初始化方法__init__和重写的加法操作__add__。通过这种缩进结构,我们可以清晰地看到代码的层次结构和逻辑。


在 Python 编码中,缩进格式、行间空行数、变量和等号之间的空格等都遵循 PEP8(Python Enhancement Proposal 8)规范。可以使用autopep8包来自动实现 PEP8 规范,保持代码的规范和易读性。

特殊关键字

Python 有 35 个关键字,这些关键字具有特殊的含义,不能用于自定义变量名,否则会引起语法错误。以下是 Python 的关键字列表:


False      await      else       import     passNone       break      except     in         raiseTrue       class      finally    is         returnand        continue   for        lambda     tryas         def        from       nonlocal   whileassert     del        global     not        withasync      elif       if         or         yield
复制代码


这些关键字在 Python 编程中扮演着重要的角色。其中,TrueFalse用于表示布尔值的真和假,类似于 Java 中的truefalseNone表示空值,类似于 Java 中的null;Python 使用not表示逻辑反操作,而 Java 使用!;Python 使用and表示两个条件同时满足,Java 使用&&;Python 使用or表示两个条件满足其一,Java 使用||;Python 使用elif,而 Java 使用else if


还有一些比较特殊的关键字,例如:


  • del用于删除可迭代对象中的某个元素;

  • def用于定义函数;

  • 带有yield的关键字用于定义生成器(generator)函数;

  • globalnonlocal是在 Python 函数式编程的闭包场景中使用的。


pass关键字用于占位,当你在定义函数或类时暂时不想添加具体的实现时,可以使用pass关键字。


这些关键字的具体用法将在后续文章中更详细地介绍。在此,先对它们有一个整体的认识即可。

特殊运算符

Python 的运算符包括:


+       -       *       **      /       //      %      @<<      >>      &       |       ^       ~       :=<       >       <=      >=      ==      !=
复制代码


大部分运算符在其他编程语言中也是常见的,不过这里重点介绍三个比较特殊的运算符://**:=


//运算符用于两个数值相除并向下取整,类似于 Python 的math.floor()功能:


print(5 // 2)   # 输出: 2print(5 // 4.5) # 输出: 1.0
复制代码


**运算符用于进行幂运算:


print(2 ** 3) # 输出: 8
复制代码


:=运算符是在 Python 3.8 版本中引入的,被形象地称为“海象运算符”。它可以在表达式中同时为变量赋值和比较:


n = len(a)if n > 10:    print(f"{n}大于10")
复制代码


可以用“海象运算符”简化为:


if (n := len(a)) > 10:    print(f"{n}大于10")
复制代码


Python 的比较运算符还支持链式比较,使得编码更加方便:


i = 3print(1 < i < 3)  # 输出: Falseprint(1 < i <= 3) # 输出: True
复制代码


此外,运算符@用于装饰器功能,本专栏会深入解释它的本质,并提供相关案例,帮助你学会使用装饰器。

总结

在本文中,我们一起学习了 Python 这门功能强大的编程语言。Python 的两大特性是动态语言和强类型语言。


动态语言意味着在运行时执行类型检查,而不是在编译时。这使得 Python 更加灵活和易于使用,允许我们在代码中动态创建和修改变量。Python 的动态特性使其成为进行数据预处理、数据探索性分析、数据挖掘、机器学习和深度学习等任务的首选语言。


另一方面,强类型语言意味着变量的类型在声明时就已经确定,并且不能进行隐式类型转换。这确保了代码的稳定性和安全性,帮助我们避免一些常见的错误。


在 Python 的基本语法方面,我们学习了变量命名规则,缩进原则,特殊关键字和特殊运算符。Python 的命名规则允许使用英文、数字和下划线,但不能以数字开头,并且区分大小写。特殊关键字包括 Python 的 35 个关键字,如 if、else、for、while 等等,它们有着特定的含义和用途。特殊运算符中,//用于整数除法,**用于幂运算,:=是在 Python 3.8 版本中引入的“海象运算符”,使得在表达式中同时为变量赋值和比较变得更加方便。


通过学习 Python 的特性和基本语法,我们已经具备了编写简单到复杂的程序的基础知识。Python 的易用性、丰富的库和社区支持,使其成为一个优秀的编程语言,适用于各种应用场景。无论是初学者还是有经验的开发者,Python 都是一个值得深入学习和探索的语言。


希望本文能够为读者提供了一个对 Python 的初步认识,并激发了你继续学习和研究的兴趣。在接下来的学习过程中,我们可以更深入地了解 Python 的各种功能和应用领域,并用 Python 来解决更复杂的问题。


好了,我是茶桁,咱们下节见。

发布于: 刚刚阅读数: 3
用户头像

Hivan

关注

还未添加个人签名 2020-10-20 加入

还未添加个人简介

评论

发布
暂无评论
1. Python的特性和语法_Python_Hivan_InfoQ写作社区