【Python】Python 入门基础

一、Python 背景知识

1、Python 的由来

吉多·范罗苏姆(Guido van Rossum) 是一个荷兰程序员 (人称龟叔, 名字前三个字母是 Gui),龟叔在 1989 年圣诞节的时候 (当时 33 岁), 因为在家里待着无聊, 为了打发时间, 开始了 Python 的开发;Python 第一个正式版本发布于 1991 年。image-20230311234142202

2、Python 的应用场景

经历了多年的发展, Python 目前已经是一个应用场景非常广泛的编程语言了,它主要应用于如下方面:

  • 科学计算&数据分析;
  • Web 开发 (搭建网站);
  • 自动化运维;
  • 人工智能;
  • 爬虫程序;
  • 自动化测试。

3、Python 的优缺点

Python 的优点:

  • 语法言简意赅, 容易上手.
  • 功能强大, 用途广泛.
  • 生态丰富, 具有海量的成熟第三方库.
  • 方便调用 C/C++ 编写的代码进行 高性能/系统级 操作

Python 的缺点:

  • 执行效率比较弱.
  • 对于多核心并发程序支持偏弱.
  • 动态类型系统对于大型项目不太友好.

在实际工作中,Python 更多是作为一种辅助性语言,即能够在某些特定场景下帮助程序猿们解决某些问题的一种工具。


二、常量、表达式和语句

我们可以把 Python 当成一个计算器, 来进行一些算术运算:

print(1 + 2 - 3)
print(1 + 2 * 3)
print(1 + 2 / 3)

其中 1 2 3 这些数字就是常量, 1 + 2 - 3 是一个表达式,print(1 + 2 - 3) 则是一条语句;

和 C/C++/java 不同,Python 中的一条语句的末尾可以加分号,也可以不加分号,我们通常习惯不加分号;不过当两条语句处于同一行时,就必须用分号分割。

# 正常情况下语句末尾不加分号
print(1 + 2 - 3)
print(1 + 2 * 3)

# 当两条语句处于同一行时必须加分号用于分割
print(1 + 2 - 3); print(1 + 2 * 3)

另外,在 Python 中,整数相除整数的结果是双精度浮点数,但是在 C/C++ 中,整数相除结果仍然是整数:image-20230312000403713

注:print 是 Python 中内置的输出函数。


三、变量和类型

1、变量

1.1 变量的定义

在 Python 中变量的类型由初始化值的类型自动推导,而不用我们显示声明,当然我们也可以显示声明变量的类型,但是一般不会;并且当声明的变量类型和初始化值的类型不同时,变量类型仍为初始化值的类型:image-20230312001249693

注:type() 是 Python 中的内置函数,它可以识别变量的类型。

变量的命名规则 – 必须遵守的硬性规则:

  • 变量名必须由数字、字母以及下划线构成.
  • 数字不能开头.
  • 变量名不能和 “关键字” 重复.
  • 变量名大小写敏感,即 num 和 Num 是两个不同的变量名.

变量的命名规则 – 建议遵守的软性规则:

  • 变量名使用有描述性的单词来表示, 尽量表达出变量的作用.
  • 一个变量名可以由多个单词构成, 长一点没关系, 但是含义要清晰.
  • 当变量名包含多个单词的时候, 建议使用 “驼峰命名法” 或者 “蛇形命名法”.

1.2 变量的使用

我们可以读取和修改变量的值,也可以将一个变量的值赋值给另一个变量:

a = 1
print(a)
a = 2
b = a

2、类型

2.1 Python 中的类型

整形

Python 中的整形很特殊 – 它可以根据值的大小来扩大变量在内存中占用的空间大小,也就是说它的数据表示范围是没有上限的,只要内存足够大, 理论上就可以表示无限大小的数据。image-20230312002926124

注:C/C++/java 中整形家族除了 int 之外,还有 char、short、long、long long 等类型,它们的本质区别是占用的内存空间大小不同,所以能表示的数据范围不同,而既然 Python 中的 int 能表示无限大和无限小的数据,所以自然也不存在 char、short、long 等类型

浮点型

Python 中的浮点数类型为 float,但它占用的内存空间为8字节,为双精度浮点数,所以 Python 中的 float 等价于 C/C++/java 中的 double 类型;Python 中没有单精度浮点数类型image-20230312003528737

字符串

在 Python 中,使用 ’ 或者 " 括起来的一个或多个字符被称为字符串;需要注意单引号构成的字符串和双引号构成的字符串完全相同,没有任何区别。image-20230312004728516

注:由于 Python 中没有字符类型 char,所以被 ’ 括起来的一个字符也是字符串类型,而不是字符类型。

在 Python 中,我们有时还会遇到需要 ’ 和 " 配合使用的情况,甚至于 ’ " 和 ‘’’ “”" 配合的情况,如下:image-20230312005614447

布尔

和 C/C++/java 中的布尔类型不同,Python 中的布尔类型的首字母是大写的 – True or False.image-20230312005933006

其他类型

除了上述类型之外, Python 中还有 list, tuple, dict, 自定义类型 等等. 我们后续再介绍。

2.2 类型的意义

Python 中为什么会存在这么多类型呢?这是因为不同的类型有不同的意义:

  • 类型决定了数据在内存中占据多大空间;比如 float 在内存中占8字节,bool在内存中占1字节。
  • 类型其实约定了能对这个变量做什么样的操作;比如 int/float 可以进行 + - * /,而 str 只能进行 +。

总结:类型系统其实是在对变量进行 “归类”. 相同类型的变量(数据) 往往具有类似的特性和使用规则。

2.3 动态类型特性

在 Python 中, 一个变量是什么类型, 是可以在 “程序运行” 过程中发生变化的. 这个特性称为 “动态类型”;而像 C/C++/java,变量的类型一旦在定义时确定后在后面的程序中就不能被改变,这种特性称为 “静态类型”。image-20230312010614862

动态类型特性是一把双刃剑:

  • 对于中小型程序, 可以大大的解约代码量 (比如写一段代码就可以同时支持多种类型);
  • 对于大型程序, 则提高了模块之间的交互成本 (程序猿 A 提供的代码难以被 B 理解)。

总结:动态类型相比于静态类型更 “灵活”,它提高了语言的表达能力;然而在编程中领域中,"灵活"往往是一个贬义词,因为它代表着更容易出错,尤其是在多人协作的开发的大型项目中;所以相较来说静态类型要更好一些。

注:一个编程语言, 是否是动态类型, 只是取决于运行时变量的类型是否发生改变,不取决于变量定义的时候是否声明类型!Python 同样支持变量定义时声明类型,但它是动态类型。


四、注释

1、注释风格

Python 中有两种风格的注释:

(1)行注释:使用 # 开头的行都是注释

# 这是一行注释

(2)文档字符串:使用三引号引起来的称为 “文档字符串”, 也可以视为是一种注释。

  • 它可以包含多行内容;
  • 一般放在 文件/函数/类 的开头;
  • 使用 “”" 和 ‘’’ 等价.
"""
这是文档字符串
这是文档字符串
"""

PyCharm 中多行注释/取消注释快捷键:Ctrl + /

2、注释规范

注释的规范:

  • 内容准确: 注释内容要和代码一致, 匹配, 并在代码修改时及时更新.
  • 篇幅合理: 注释既不应该太精简, 也不应该长篇大论.
  • 使用中文: 一般中国公司都要求使用中文写注释, 外企另当别论.
  • 积极向上: 注释中不要包含负能量(例如 领导 SB 等).

五、输入输出

1、input

Python 中的输入函数是 input,当我们调用 input 函数并运行程序后,input 就会一直等待用户输入;需要特别注意的是,input 函数的返回值是 str,如果我们要使用其返回值进行算术运算,则需要进行类型转换或者调用 eval 函数。image-20230312013244067

2、print

print 是 Python 的输出函数,它可以输出任何类型的变量;同时,它还可以输出 int/float 混合表达式的值,也可以拼接字符串。image-20230312014324520

但是我们不能在 print 中将 int 与 str 进行拼接,如果想拼接整形和字符串,我们需要使用格式化字符串 f-string – 在字符串"前面加上字符 f 表示格式化,然后在字符串中用 {} 包裹住要输出的整形值:image-20230312014827581

image-20230312015107583

注:在格式化打印字符串的道路上,很多编程语言都进行了各自的探索 – 比如 C 语言的 printf 函数使用 %d, %s 这样的占位符来进行格式化控制;C++的 std:cout 使用流插入运算符 << 配合运算符重载和函数重载来实现格式化控制;Java采用了字符串拼接,允许字符串和其他类型的值进行拼接;Python最早支持的格式化字符串也是效仿 C 语言的 printf,只是在其继承上做了改进,直到 Python 3.6 版本才开始支持 f-string。

注:Python 也支持在 print 函数中使用 , 将两个不同/相同类型的变量进行输出,而不会发生冲突:image-20230312015723257

其实,print 函数还有其他更复杂、更准确的进行格式化输出控制的方法,这里我就不再介绍。


六、运算符

1、算术运算符

Python 中有如下算术运算符:

  • 加减乘除 + - * /
  • 取模、乘方、整数除法:% ** //

除运算

在 C/C++ 中,整数除以整数的结果还是一个整数,比如 2/1=0,而在 Python 中,整数除整数的结果也可能是小数,而不会发生截断image-20230317115124779

而 Python 中的整数除法 // 其实才是对应的 C/C++ 中的除法 – // 是整数除法,整数除以整数结果还是整数并向下取整 (舍弃小数部分, 并向下取整, 注意不是四舍五入,也不是0向取整):image-20230317115710945

Python 中的除0问题

在 Python 中,如果遇到除0运算这种运行错误,就会抛出异常,异常抛出后程序就直接终止执行了,而不会继续往下执行:image-20230317120204210

注意:在 Python 中,除以整数0和除以浮点数0结果都是抛出异常,而在有些编程语言中,除以浮点数0的结果是无穷大。

取模运算

取模运算也就是是求余数,需要注意的是在 Python 中,负数取模得到的结果始终是大于0的,而在 C/C++ 中,负数取模的结果也可能是负数:image-20230317120649124

乘方运算

** 是求乘方,它可以一个数的任意次方,包括整数次方和小数次方 (开方)、正数次方和负数次方:image-20230317120927529

2、关系运算符

像 < <= > >= == != 这一系列的运算符称为 关系运算符, 它们是在比较操作数之间的关系,其运算规则如下:

  • 如果关系符合, 则表达式返回 True. 如果关系不符合, 则表达式返回 False.
  • 关系运算符不光针对整数/浮点数进行比较, 还能针对字符串进行比较.
  • 在比较字符串时,比较依据是字符串的字典序大小.

字符串比较

在某些编程语言中,字符串是不能直接进行比较的,比如 C语言 必须使用 compare 函数进行比较 (直接比较比较的是两个字符串首元素地址的大小),Java 只能使用 equals 方法进行比较 (直接比较比较的是两个字符串是否是同一对象),但其实这是小众的行为;

多数的编程语言其实是支持字符串直接进行比较的,只是其内部可能对比较的逻辑进行了进一步处理而已,比如 C++ 就使用运算符重载来支持两个字符串的比较。

浮点数比较

针对浮点数来说,直接使用 == 来进行比较是存在风险的,这是由于浮点数在计算机中采用 IEEE754 标准存储,所以当浮点数过长时会被截断而产生误差,所以我们在比较两个浮点数时应该比较二者的差值,观察其是否在允许的误差范围内。image-20230312004227074

3、逻辑运算符

像 and or not 这一系列的运算符称为 逻辑运算符:

  • and 表示并且,当两侧操作数均为 True 时,结果才为 True (一假则假).
  • or 表示或者,当两侧操作数有一个为 True 时,结果为 True (一真则真).
  • not 表示逻辑取反,操作数本身为 True, 则返回 False. 本身为 False, 则返回 True.

image-20230317122351311

注:在 Python 中,a < b and b < c 这个操作等价于 a < b < c,也就是说 Python 支持连续比较,而在大部分编程语言中是不允许这样的,比如在 C语言中 a < b < c 表示拿 a<b 的结果与 C 进行比较,而 a<b 的结果只能是0或者1。

短路求值

和其他编程语言类似, Python 也存在短路求值的规则:

  • 对于 and, 如果左侧表达式为 False, 则整体一定为 False, 右侧表达式不再执行.
  • 对于 or, 如果左侧表达式为 True, 则整体一定为 True, 右侧表达式不再执行.

4、赋值运算符

和大多数编程语言一样,= 是 Python 中的赋值运算符,而 == 是比较运算符,只是在 Python 中,除了一般的赋值操作外,Python 还允许链式赋值和多元赋值image-20230317123200901

多元赋值可以让我们很方便的完成很多事情,比如交换两个变量的值:image-20230312002502316

5、复合运算符

Python 还有一些 复合赋值运算符,例如 += -= *= /= %=;其中 a += 1 等价于 a = a + 1 . 其他复合赋值运算符也是同理.

需要特别注意的是:像 C++ / Java 中, 存在 ++ – 这样的自增/自减运算符. Python 中则不支持这种运算. 如果需要使用, 则直接使用 += 1 或者 -= 1. Python 这样设计的原因有两个:

  1. Python 的设计哲学是一个问题只提供一种解决方案,而 ++ – 和 += 1 -= 1 的作用是一样的,所以没必要都存在.
  2. ++ – 最大的问题就是容易分不清前置和后置的区别. 这一点 Python 语法在设计的时候就进行了规避, 避免出现这种不直观, 并且容易混淆的语法.

6、其他运算符

除了上述之外, Python 中还有一些运算符, 比如 身份运算符 (is, is not), 成员运算符 (in, not in), 位运算符 ( & | ~ ^ << >>) 等. 此处咱们暂时不介绍.


猜你喜欢

转载自blog.csdn.net/m0_62391199/article/details/129656773