打算暑假最后一个月学一学Python基础语法, 从这篇博客开始记录老师的笔记. 没错, 这是老师的笔记, 写的不怎么样, 但是我也懒得整理了, 自己能看懂就行了.

什么是计算机语言

计算机就是一台用来计算的机器,人让计算机干什么计算机就得干什么!需要通过计算机的语言来控制计算机(编程语言), 计算机语言其实和人类的语言没有本质的区别,不同点就是交流的主体不同. 计算机语言发展经历了三个阶段:

  1. 机器语言
    • 机器语言通过二进制编码来编写程序
    • 执行效率好,编写起来太麻烦
  2. 符号语言(汇编)
    • 使用符号来代替机器码
    • 编写程序时,不需要使用二进制,而是直接编写符号
    • 编写完成后,需要将符号转换为机器码,然后再由计算机执行. 符号转换为机器码的过程称为汇编
    • 将机器码转换为符号的过程,称为反汇编
    • 汇编语言一般只适用于某些硬件,兼容性比较差
  3. 高级语言
    • 高级语言的语法基本和现在英语语法类似,并且和硬件的关系没有那么紧密了
    • 也就是说我们通过高级语言开发程序可以在不同的硬件系统中执行
    • 并且高级语言学习起来也更加的容易,现在我们知道的语言基本都是高级语言
    • C、C++、C#、Java、JavaScript、Python …

编译型语言和解释型语言

计算机只能识别二进制编码(机器码),所以任何的语言在交由计算机执行时必须要先转换为机器码,也就是像 print(‘hello’) 必需要转换为类似 1010101 这样的机器码, 根据转换时机的不同,语言分成了两大类:

  1. 编译型语言
    • C语言
    • 编译型语言,会在代码执行前将代码编译为机器码,然后将机器码交由计算机执行
    • a(源码) --编译–> b(编译后的机器码)
    • 特点:1. 执行速度特别快 2. 跨平台性比较差
  2. 解释型语言
    • Python JS Java
    • 解释型语言,不会在执行前对代码进行编译,而是在执行的同时一边执行一边编译
    • a(源码)–解释器–> 解释执行
    • 特点:1. 执行速度比较慢 2. 跨平台性比较好

Python介绍

Python是解释型语言

Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/),是一种广泛使用的高级编程语言,属于通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年。可以视之为一种改良(加入一些其他编程语言的优点,如面向对象)的LISP。作为一种解释型语言,Python的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词)。相比于C++或Java,Python让开发者能够用更少的代码表达想法。不管是小型还是大型程序,该语言都试图让程序的结构清晰明了。

Life is short you need Python (人生苦短,我用Python)

Python的用途:

  1. WEB应用
    • Facebook 豆瓣 …
  2. 爬虫程序
  3. 科学计算
  4. 自动化运维
  5. 大数据(数据清洗)
  6. 云计算
  7. 桌面软件/游戏
  8. 人工智能

Python开发环境搭建

开发环境搭建就是安装Python的解释器

Python的解释器分类:

  1. CPython(官方):用c语言编写的Python解释器
  2. PyPy : 用Python语言编写的Python解释器
  3. IronPython : 用.net编写的Python解释器
  4. Jython: 用Java编写的Python解释器

步骤:

  1. 下载安装包 python-3.6.5.exe

  2. 安装(傻瓜式安装)

  3. 打开命令行窗口,输入python 出现如下内容

    Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)] on win32 Type “help”, “copyright”, “credits” or “license” for more information.

    >>>

Python的交互界面

当我们通过命令行来输入Python,所进入到的界面就是Python的交互界面

结构:

  1. 版本和版权声明:

    Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)] on win32

    Type “help”, “copyright”, “credits” or “license” for more information.

  2. 命令提示符:

    >>>

在命令提示符后可以直接输入Python的指令!输入完的指令将会被Python的解释器立即执行!安装Python的同时,会自动安装一个Python的开发工具IDLE,通过IDLE也可以进入到交互模式. 但是不同的是,在IDLE中可以通过TAB键来查看语句的提示。IDLE实际上就是一个交互界面,但是他可以有一些简单的提示,并且可以将代码保存. 交互模式只能你输入一行代码,它就是执行一行,所以他并不适用于我们日常的开发!仅可以用来做一些日常的简单的测试! 我们一般会将Python代码编写到一个py文件中,然后通过python指令来执行文件中的代码.

Python和Sublime的整合

  1. 在Sublime中执行Python代码,ctrl + b 自动在Sublime内置的控制台中执行

    这种执行方式,在某些版本的Sublime中对中文支持不好,并且不能使用input()函数

  2. 使用SublimeREPL来运行python代码. 点击首选项=>Package Control. 在搜索框中输入SublimeREPL来安装.

    image-20200805214824257

    安装完成后可以在工具选项卡中的最后一行看到SublimeREPL. 接下来设置快捷键. 希望通过F5自动执行当前的Python代码. 点击首选项=>快捷键设置, 在右侧窗口中粘贴下面的代码. 保存退出即可.

    1
    { "keys": ["f5"], "caption": "SublimeREPL:Python","command": "run_existing_window_command", "args":{"id": "repl_python_run","file": "config/Python/Main.sublime-menu"}}

    image-20200805215200851

几个概念

  1. 表达式

    表达式就是一个类似于数学公式的东西, 比如:10 + 5 8 - 4 , 表达式一般仅仅用了计算一些结果,不会对程序产生实质性的影响, 如果在交互模式中输入一个表达式,解释器会自动将表达式的结果输出.

  2. 语句

    在程序中语句一般需要完成某种功能,比如打印信息、获取信息、为变量赋值…

    比如:

    print()

    input()

    a = 10

    语句的执行一般会对程序产生一定的影响 , 在交互模式中不一定会输出语句的执行结果 .

  3. 程序(program)

    程序就是由一条一条的语句和一条一条的表达式构成的。

  4. 函数(function)

    函数就是一种语句,函数专门用来完成特定的功能 , 形如:xxx( )

    函数的分类:

    • 内置函数 : 由Python解释器提供的函数,可以在Python中直接使用
    • 自定义函数 : 由程序员自主的创建的函数

    当我们需要完成某个功能时,就可以去调用内置函数,或者自定义函数 .

    函数的两个要素:

    • 参数 : ()中的内容就是函数的参数 ; 函数中可以没有参数,也可以有多个参数,多个参数之间使用,隔开
    • 返回值 : 返回值是函数的返回结果,不是所有的函数都有返回值

基本语法

  1. 在Python中严格区分大小写

  2. Python中的每一行就是一条语句,每条语句以换行结束

  3. Python中每一行语句不要过长(规范中建议每行不要超过80个字符)

  4. 一条语句可以分多行编写,多行编写时语句后边以\结尾

  5. Python是缩进严格的语言,所以在Python中不要随便写缩进

  6. 在Python中使用#来表示注释,#后的内容都属于注释,注释的内容将会被解释器所忽略

    我们可以通过注释来对程序进行解释说明,一定要养成良好的编写注释的习惯 , 注释要求简单明了,一般习惯上#后边会跟着一个空格.

字面量和变量

  • 字面量就是一个一个的值,比如:1,2,3,4,5,6,‘HELLO’ , 字面量所表示的意思就是它的字面的值,在程序中可以直接使用字面量 .
  • 变量(variable)变量可以用来保存字面量,并且变量中保存的字面量是不定的. 变量本身没有任何意思,它会根据不同的字面量表示不同的意思.

一般我们在开发时,很少直接使用字面量,都是将字面量保存到变量中,通过变量来引用字面量.

变量和标识符

Python中使用变量,不需要声明,直接为变量赋值即可 , 不能使用没有进行过赋值的变量 , 如果使用没有赋值过的变量,会报错 NameError: name ‘b’ is not defined.

Python是一个动态类型的语言,可以为变量赋任意类型的值,也可以任意修改变量的值.

1
2
3
a = 5
a = 'hello'
# 可以用不同类型的值去覆盖

在Python中所有可以自主命名的内容都属于标识符 , 比如:变量名、函数名、类名 , 标识符必须遵循标识符的规范.

  1. 标识符中可以含有字母 , 数字, _,但是不能使用数字开头

    例如: a1_ _a1 _1a

  2. 标识符不能是Python中的关键字和保留字. 也不建议使用Python中的函数名作为标识符,因为这样会导致函数被覆盖

  3. 命名规范:

    • 下划线命名法: 所有字母小写,单词之间使用 _分割

      例如: max_length min_length hello_world xxx_yyy_zzz

    • 帕斯卡命名法(大驼峰命名法): 首字母大写,每个单词开头字母大写,其余字母小写

      例如: MaxLength MinLength HelloWorld XxxYyyZzz

如果使用不符合标准的标识符,将会报错 SyntaxError: invalid syntax

数据类型

数据类型指的就是变量的值得类型,也就是可以为变量赋哪些值

数值

在Python数值分成了三种:整数浮点数(小数)复数

在Python中所有的整数都是int类型

Python中的整数的大小没有限制,可以是一个无限大的整数 , 这是Python和其他语言不同的特点.

例如下述代码可以被执行

1
c = 999999999999999999999999999999999999999999999 ** 100

其执行结果为:

image-20200805221945805

关于数值类型的其他细节内容 , 在下述代码中以注释的形式加以说明.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
c = 123_456_789 # 如果数字的长度过大,可以使用下划线作为分隔符
print(c) # 结果为123456789 下划线只是便于阅读的左右. 可以在任意位置用下划线分隔

# d = 0123 10进制的数字不能以0开头
# 二进制 0b开头
c = 0b10 # 二进制的10
# 八进制 0o开头
c = 0o10
# 十六进制 0x开头
c = 0x10
# 其他进制的整数,只要是数字打印时一定是以十进制的形式显示的

# 也可以通过运算符来对数字进行运算,并且可以保证整数运算的精确
c = -100
c = c + 3

# 浮点数(小数),在Python中所有的小数都是float类型
c = 1.23
c = 4.56

# 对浮点数进行运算时,可能会得到一个不精确的结果
c = 0.1 + 0.2

print(c) # 0.30000000000000004 这是所有编程语言都有的问题

字符串(str)

字符串用来表示一段文本信息,字符串是程序中使用的最多的数据类型 , 在Python中字符串需要使用引号引起来.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
s = 'hello'
# s = abc # 字符串必须使用引号引起来,不使用不是字符串

# 引号可以是双引号,也可以是单引号,但是注意不要混着用
s = 'hello'
s = "hello"
# s = 'hello" 引号不能混合使用 SyntaxError: EOL while scanning string literal

# 相同的引号之间不能嵌套
# s = "子曰:"学而时习之,乐呵乐呵!""
s = '子曰:"学而时习之,乐呵乐呵!"'

# 长字符串
# 单引号和双引号不能跨行使用
s = '锄禾日当午,\
汗滴禾下土,\
谁知盘中餐,\
粒粒皆辛苦'
# 此方式的打印结果仍然是 1 行, 这种方式只是显示的换行, 逻辑上没有换行.

# 使用三重引号来表示一个长字符串 ''' """
# 三重引号可以换行,并且会保留字符串中的格式
s = '''锄禾日当午,
汗滴禾下土,
谁知盘中餐,
粒粒皆辛苦'''
# 此种方式的打印输出结果会保留换行格式

# 转义字符
# 可以使用 \ 作为转义字符,通过转义字符,可以在字符串中使用一些特殊的内容
# 例子:
# \' 表示'
# \" 表示"
# \t 表示制表符
# \n 表示换行符
# \\ 表示反斜杠
# \uxxxx 表示Unicode编码
s = "子曰:\"学而时习之,\n乐呵乐呵!\""

s = '\u2250'
print(s)

格式化字符串

对于a = 123这个变量而言, 在打印输出过程中 , 我希望的得到的结果是a = 123 而不是数字123本身. 此时就涉及到字符串的格式化问题.

有很多种办法可以解决上述的问题 , 这里介绍几种常用的方法.

可以通过print()函数传入多个参数来实现上面的期望效果.

1
2
3
a = 123
print("a = ",a)
# 输出为 a = 123

在字符串的创建过程中 , 可以指定占位符. 使用方法是在字符串中加入%s占位符, 在字符串后跟一个%加占位内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# %s 在字符串中表示任意字符
# %f 浮点数占位符
# %d 整数占位符
b = 'Hello %s'%'孙悟空'
print(b) # Hello 孙悟空
b = 'hello %s 你好 %s'%('tom','孙悟空')
print(b) # hello tom 你好 孙悟空
b = 'hello %3.5s'%'abcdefg' # %3.5s字符串的长度限制在3-5之间
print(b) # hello abcde
b = 'hello %s'%123.456
print(b) # hello 123.456
b = 'hello %.2f'%123.456
print(b) # hello 123.46
b = 'hello %d'%123.95
print(b) # hello 123

于是, 可以使用此方法解决上面的问题.

1
2
a =123
print('a = %s'%a)

下面介绍一个在Python3中的语法 , 在创建字符串时, 在字符串前面加上一个小写字母f来创建一个格式化字符串 , 在格式化字符串中 , 可以直接嵌入变量 .

1
2
3
4
5
6
7
a = 123
print(f'a = {a}')

# 可以嵌入多个不同类型的变量
c = '234'
d = 12.4
str = f'a = {a}, c = {c} , d = {d}'

字符串拼接与复制

对于name = 孙悟空, 可以使用下面四种方式来输出欢迎孙悟空光临.

1
2
3
4
5
6
7
8
# 拼串
print('欢迎 '+name+' 光临!')
# 多个参数
print('欢迎',name,'光临!')
# 占位符
print('欢迎 %s 光临!'%name)
# 格式化字符串
print(f'欢迎 {name} 光临!')

python中可以通过对字符串做*运算 , 来实现字符串自身的复制.

1
2
3
4
5
6
a = 'abc'
# * 在语言中表示乘法
# 如果将字符串和数字相乘,则解释器会将字符串重复指定的次数并返回
a = a * 20

print(a)

布尔值和空值

布尔值主要用来做逻辑判断 , 布尔值一共有两个 True 和 False , True表示真 False表示假 . 布尔值实际上也属于整型,True就相当于1,False就相当于0.

Python中严格区分大小写 , True , False 和 None 的首字母均为大写

1
2
3
4
5
print(True) # True
print(False) # False
print(1 + False) # 1
print(1 + True) # 2
print(True + False) # 1

None(空值), 专门用来表示不存在 .

1
2
b = None
print(b) # None

对象(object)

Python是一门面向对象的语言 , 在Python中 , 一切皆对象!

程序运行当中,所有的数据都是存储到内存当中然后再运行的 , 对象就是内存中专门用来存储指定数据的一块区域 , 对象实际上就是一个容器,专门用来存储数据 , 像我们之前学习的数值、字符串、布尔值、None都是对象 . 其结构参考下图.

image-20200805235028678

对象的结构

每个对象中都要保存三种数据.

  1. id(标识)

    • id用来标识对象的唯一性,每一个对象都有唯一的id
    • 对象的id就相当于人的身份证号一样
    • 可以通过id()函数来查看对象的id
    • id是由解析器生成的,在CPython中,id就是对象的内存地址
    • 对象一旦创建,则它的id永远不能再改变
  2. type(类型)

    • 类型用来标识当前对象所属的类型
    • 比如:int str float bool …
    • 类型决定了对象有哪些功能
    • 通过type()函数来查看对象的类型
    • Python是一门强类型的语言,对象一旦创建类型便不能修改
  3. value(值)

    • 值就是对象中存储的具体的数据

    • 对于有些对象值是可以改变的

    • 对象分成两大类,可变对象 不可变对象 .

      可变对象的值可以改变

      不可变对象的值不能改变,之前学习的对象都是不可变对象

image-20200805235359950

对象和变量

对象并没有直接存储到变量中,在Python中变量更像是给对象起了一个别名 , 变量中存储的不是对象的值,而是对象的id(内存地址), 当我们使用变量时,实际上就是在通过对象id在查找对象 . 变量中保存的对象,只有在为变量重新赋值时才会改变 . 变量和变量之间是相互独立的,修改一个变量不会影响另一个变量 .

image-20200805235549199

类型检查与转换

类型检查

通过类型检查,可以检查变量的类型 . type()用来检查值的类型 , 该函数会将检查的结果作为返回值返回,可以通过变量来接收函数的返回值 .

1
2
3
4
5
print(type(1)) # <class 'int'>
print(type(1.5)) # <class 'float'>
print(type(True)) # <class 'bool'>
print(type('hello')) # <class 'str'>
print(type(None)) # <class 'NoneType'>

类型转换

所谓的类型转换,将一个类型的对象转换为其他对象 , 类型转换不是改变对象本身的类型,而是根据当前对象的值创建一个新对象 .

这里介绍类型转换的四个函数. int( )float( )str( )bool( )

int( )可以用来将其他的对象转换为整型 , 规则:

  • 布尔值:True -> 1 False -> 0

  • 浮点数:直接取整,省略小数点后的内容

  • 字符串:合法的整数字符串,直接转换为对应的数字

    如果不是一个合法的整数字符串,则报错 ValueError: invalid literal for int() with base 10: ‘11.5’

  • 对于其他不可转换为整型的对象,直接抛出异常 ValueError

float() 和 int()基本一致,不同的是它会将对象转换为浮点数 .

str() 可以将对象转换为字符串 .

bool() 可以将对象转换为布尔值,任何对象都可以转换为布尔值 , 规则:

对于所有表示空性的对象都会转换为False,其余的转换为True .

常见的表示空性的对象:0 、 None 、 ’ ’

运算符

算术运算符

  • + 加法运算符(如果是两个字符串之间进行加法运算,则会进行拼串操作)
  • - 减法运算符
  • * 乘法运算符(如果将字符串和数字相乘,则会对字符串进行复制操作,将字符串重复指定次数)
  • / 除法运算符,运算时结果总会返回一个浮点类型
  • // 整除,只会保留计算后的整数位,总会返回一个整型
  • ** 幂运算,求一个值的几次幂
  • % 取模,求两个数相除的余数

赋值运算符

=可以将等号右侧的值赋值给等号左侧的变量 .

  • += a += 5 相当于 a = a + 5
  • -= a -= 5 相当于 a = a - 5
  • *= a *= 5 相当于 a = a * 5
  • **= a **= 5 相当于 a = a ** 5
  • /= a /= 5 相当于 a = a / 5
  • //= a //= 5 相当于 a = a // 5
  • %= a %= 5 相当于 a = a % 5

关系运算符

关系运算符用来比较两个值之间的关系,总会返回一个布尔值 , 如果关系成立,返回True,否则返回False .

常用的关系运算符有: > , >= , < , <= , == , != , is , is not .

其中 , ==!= 比较的是两个对象的值是否相等. 而isis not比较的两个对象是不是同一个对象, 也就是id是否相同.

关于字符串的比较, 在Python中通过比较字符的Unicode编码来比较字符串 , 并且字符串的比较死逐位进行比较 , 即首先比较第一个字符 , 第一个字符编码大的字符串整体就大, 第一个字符相同就比较第二个字符, 以此类推.

1
2
3
4
5
6
result = '2' > '1' # True
result = '2' > '11' # True

result = 'a' > 'b' # False
result = 'c' < 'd' # True
result = 'ab' > 'b' # False

Python中的关系运算符可以连用 , 这是Python独有的语法结构.

1
2
3
4
result = 1 < 2 < 3 # 相当于 1 < 2 and 2 < 3
result = 10 < 20 > 15

print(result) # True

逻辑运算符

逻辑运算符主要用来做一些逻辑判断

  1. not 逻辑非

    not可以对符号右侧的值进行非运算 , 对于布尔值,非运算会对其进行取反操作,True变False,False变True . 对于非布尔值,非运算会先将其转换为布尔值,然后再取反 .

  2. and 逻辑与

    nd可以对符号两侧的值进行与运算 , 只有在符号两侧的值都为True时,才会返回True,只要有一个False就返回False .

    与运算是找False的 , Python中的与运算是短路的与,如果第一个值为False,则不再看第二个值

  3. or 逻辑或

    or 可以对符号两侧的值进行或运算 , 或运算两个值中只要有一个True,就会返回True .

    或运算是找True的 , Python中的或运算是短路的或,如果第一个值为True,则不再看第二个值

1
2
3
4
5
True and print('你猜我出来吗?') # 第一个值是True,会看第二个值,所以print()会执行
False and print('你猜我出来吗?') # 第一个值是False,不会看第二个值,所以print()不会执行

False or print('你猜我出来吗?') # 第一个值为False,继续看第二个,所以打印语句执行
True or print('你猜我出来吗?') # 第一个值为True,不看第二个,所以打印语句不执行

当我们对非布尔值进行与或运算时,Python会将其当做布尔值运算,最终会返回原值

  1. 与运算的规则

    与运算是找False的,如果第一个值是False,则不看第二个值

    如果第一个值是False,则直接返回第一个值,否则返回第二个值

  2. 或运算的规则

    或运算是找True的,如果第一个值是True,则不看第二个值

    如果第一个值是True,则直接返回第一个值,否则返回第二个值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# True and True
result = 1 and 2 # 2
# True and False
result = 1 and 0 # 0
# False and True
result = 0 and 1 # 0
# False and False
result = 0 and None # 0

# True or True
result = 1 or 2 # 1
# True or False
result = 1 or 0 # 1
# False or True
result = 0 or 1 # 1
# False or False
result = 0 or None # None

条件运算符

条件运算符又称三元运算符 .

语法: 语句1 if 条件表达式 else 语句2

执行流程:

  1. 条件运算符在执行时,会先对条件表达式进行求值判断
    • 如果判断结果为True,则执行语句1,并返回执行结果
    • 如果判断结果为False,则执行语句2,并返回执行结果
1
2
3
4
5
6
7
8
a = 30
b = 50

# print('a的值比较大!') if a > b else print('b的值比较大!')
# 获取a和b之间的较大值
max = a if a > b else b

print(max)

运算符的优先级

和数学中一样,在Python运算也有优先级,比如先乘除 后加减 . 运算符的优先级可以根据优先级的官方表格来查询,在表格中位置越靠下的运算符优先级越高,优先级越高的越优先计算 , 如果优先级一样则自左向右计算 .

关于优先级的表格,你知道有这么一个东西就够了,千万不要去记 , 在开发中如果遇到优先级不清楚的,则可以通过小括号来改变运算顺序 .