Files
python-book/01.基础语法/01.python基础.md
2025-08-27 14:39:37 +08:00

913 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Python基础
## 安装python
## 运行python代码
在硬盘创建文件 t1.py并且使用 PyCharm 打开,输入以下代码
```python
print('Hello World!')
```
然后右键运行
![image](01.python基础/1553917000771-909b5d59-8d4a-4e57-9dfe-95f0ba3a12ee.png)
运行结果
```
C:\Users\Aaron\AppData\Local\Programs\Python\Python35\python.exe C:/Users/Aaron/Desktop/py/t1.py
Hello World!
Process finished with exit code 0
```
## 注释
当行注释:# 被注释内容
多行注释:''' 被注释内容 ''',或者 """ 被注释内容 """
## 变量
变量是什么? 变量:把程序运行的中间结果临时的存在内存里,以便后续的代码调用。
## 声明变量
```python
a = "Hello World!"
print(a)
```
## 变量定义的规则
- 变量名只能是 字母、数字或下划线的任意组合
- 变量名的第一个字符不能是数字
- 以下关键字不能声明为变量名
- ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
- 变量的定义要具有可描述性。
## 变量的赋值
```python
a = "变量1"
b = "变量2"
```
![image](01.python基础/1553917013597-9d6b5e70-3c79-4042-81a1-2459eca7cae8.png)
```python
a = "变量1"
b = a
```
![image](01.python基础/1553917020154-5c92c78b-e289-42a7-8b42-d6f563ed4dad.png)
## 常量
常量即指不变的量,如 pi 3.141592653..., 或在程序运行过程中不会改变的量。
## 程序交互
```python
name = input("请输入姓名:")
print(name)
```
执行脚本就会发现,程序会等待你输入姓名后再往下继续走。
```python
请输入姓名Aaron
Aaron
```
## 基础数据类型
### 整数型int
在 32 位机器上,整数的位数为 32 位,取值范围为 -2**312**31-1即 -21474836482147483647
在 64 位系统上,整数的位数为 64 位,取值范围为 -2**632**63-1即 -92233720368547758089223372036854775807
注意:在 Python3 里不再有 long 类型了,全都是 int
```python
a = 2**64
print(type(a)) #type()是查看数据类型的方法
b = 2**60
print(type(b))
```
运行结果
```python
<class 'int'>
<class 'int'>
```
## 字符串类型str
在 Python 中, 加了引号的字符都被认为是字符串!
```python
a = "Eagle's Lab"
b = '''
欢迎大家来到英格科技!
今天我们学习python!'''
print(a,b)
```
运行结果
```python
Eagle's Lab
欢迎大家来到英格科技!
今天我们学习python!
```
字符串拼接
```python
a = 'eagle '
b = 'welcome '
print(b + a,'*' * 3,a * 3)
```
运行结果
```python
welcome eagle *** eagle eagle eagle
```
## 布尔值True, False)
布尔类型很简单,就两个值 ,一个 True(真),一个 False(假), 主要用记逻辑判断
```python
a = 3
b = 5
print(a < b, a > b , a != b)
```
运行结果
```
True False True
```
## 格式化输出
```python
name = input("姓名:")
age = input("年龄:")
job = input("工作:")
info = '''
----------- info of %s -----------
姓名:%s
年龄:%s
工作:%s
''' % (name,name,age,job)
print(info)
```
运行结果
```
姓名Aaron
年龄18
工作Teacher
----------- info of Aaron -----------
姓名Aaron
年龄18
工作Teacher
```
## 基本运算符
算数运算
| 运算符 | 描述 | 实例 |
| ------ | -------------- | ----------------- |
| + | 加 | a+b 输出结果30 |
| - | 减 | a-b 输出结果-10 |
| * | 乘 | a*b 输出结果200 |
| / | 除 | b/a 输出结果2 |
| % | 取模 得到余数 | b%a 输出结果0 |
| ** | 幂 | a**2 输出结果100 |
| // | 取整 | 9//2 输出结果4 |
比较运算
| 运算符 | 描述 | 实例 |
| ------ | -------- | ----------------- |
| == | 等于 | a == b 返回False |
| != | 不等于 | a != b 返回True |
| <> | 不等于 | a <> b 返回True |
| > | 大于 | a > b 返回False |
| < | 小于 | a < b 返回True |
| >= | 大于等于 | a >= b 返回False |
| <= | 小于等于 | a <= b 返回True |
赋值运算
| 运算符 | 描述 | 实例 |
| ------ | ---------------- | --------- |
| = | 赋值运算符 | c = a + b |
| += | 加法赋值运算符 | c += a |
| -= | 加法赋值运算符 | c -= a |
| *= | 乘法赋值运算符 | c *= a |
| /= | 除法赋值运算符 | c /= a |
| %= | 取模赋值运算符 | c %= a |
| **= | 幂赋值运算符 | c **= a |
| //= | 取整除赋值运算符 | c //= a |
逻辑运算
| 运算符 | 描述 | 实例 |
| ------ | ---- | ------------ |
| and | 与 | a and b |
| or | 或 | a or b |
| not | 非 | not(a and b) |
在没有 () 的情况下 not 优先级高于 andand 优先级高于 or即优先级关系为()>not>and>or同一优先级从左往右计算。
x or y , x 为真,值就是 xx 为假,值是 y x and y, x 为真,值是 y,x 为假,值是 x。
成员运算
| 运算符 | 描述 | 实例 |
| ------ | ------------------------------------------------- | ---------- |
| in | 如果在指定的序列中找到值返回True,否则返回False | x in y |
| not in | 如果在指定的序列中没有找到返回True否则返回False | x not in y |
```python
print('a' in 'abcd')
print('y' not in 'xyzasd')
```
运行结果
```
True
False
```
**Python 运算符优先级**
以下表格列出了从最高到最低优先级的所有运算符:
| 运算符 | 描述 |
| ------------------------ | ------------------------------------------------------ |
| ** | 指数 (最高优先级) |
| ~ + - | 按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
| * / % // | 乘,除,取模和取整除 |
| + - | 加法减法 |
| >> << | 右移,左移运算符 |
| & | 位 'AND' |
| ^ | 位运算符 |
| <= < > >= | 比较运算符 |
| <> == != | 等于运算符 |
| = %= /= //= -= += *= **= | 赋值运算符 |
| is is not | 身份运算符 |
| in not in | 成员运算符 |
| not and or | 逻辑运算符 |
## 流程控制之 --if
单分支
```python
if 条件:
满足条件后要执行的代码
```
双分支
```python
"""
if 条件:
满足条件执行代码
else:
if条件不满足就走这段
"""
age = 48
if age > 50 :
print("尚能饭否")
else:
print("廉颇老矣")
```
运行结果
```
廉颇老矣
```
if...else ... 可以有多个分支条件
```python
if 条件:
满足条件执行代码
elif 条件:
上面的条件不满足就走这个
elif 条件:
上面的条件不满足就走这个
elif 条件:
上面的条件不满足就走这个
else:
上面所有的条件不满足就走这段
```
## 流程控制之 --while
基本循环
```python
while 条件:
循环体
```
如果条件为真,那么循环体则执行
如果条件为假,那么循环体不执行
循环中止语句
break 用于完全结束一个循环,跳出循环体执行循环后面的语句
continue 和 break 有点类似,区别在于 continue 只是终止本次循环接着还执行后面的循环break 则完全终止循环
```python
print('猜数字游戏开始')
num = 54
while True:
guess = int(input("您猜数字是什么?(输入0-100的数字)"))
if guess < num:
print("您猜小了")
continue
elif guess > num:
print("您猜大了")
continue
break
print("您猜对了!")
```
运行结果
```
猜数字游戏开始
您猜数字是什么?(输入0-100的数字)50
您猜小了
您猜数字是什么?(输入0-100的数字)60
您猜大了
您猜数字是什么?(输入0-100的数字)54
您猜对了!
```
while ... else ..
while 后面的 else 作用是指,当 while 循环正常执行完,中间没有被 break 中止的话,就会执行 else 后面的语句
## 基础数据类型
### 数字 (int)
```python
v = 11
data = v.bit_length() #当十进制用二进制表示时,最少使用的位数
print(data)
```
运行结果
```
4
```
### 布尔值 ()bool
布尔值就两种TrueFalse。就是反应条件的正确与否。
真 1 True。
假 0 False。
### 字符串 str
#### 字符串的索引与切片
```python
a = 'ABCDEFGHIJK'
print(a[0])
print(a[3])
print(a[5])
print(a[7])
a = 'ABCDEFGHIJK'
print(a[0:3])
print(a[2:5])
print(a[0:]) #默认到最后
print(a[0:-1]) # -1 是列表中最后一个元素的索引但是要满足顾头不顾腚的原则所以取不到K元素
print(a[0:5:2]) #加步长
print(a[5:0:-2]) #反向加步长
```
运行结果
```
A
D
F
H
ABC
CDE
ABCDEFGHIJK
ABCDEFGHIJ
ACE
FDB
```
#### 字符串常用方法
```python
words = "beautiful is better than ugly."
print(words.capitalize()) #首字母大写
print(words.swapcase()) #大小写翻转
print(words.title()) #每个单词的首字母大写
## 内容居中,总长度,空白处填充
a = "test"
ret = a.center(20,"*")
print(ret)
## 数字符串中的元素出现的个数
ret = words.count("e",0,30)
print(ret)
a = "aisdjioadoiqwd12313assdj"
## startswith 判断是否以...开头
## endswith 判断是否以...结尾
print(a.startswith("a"))
print(a.endswith("j"))
print(a.startswith('sdj',2,5))
print(a.endswith('ado',7,10))
## 寻找字符串中的元素是否存在
print(a.find('sdj',1,10)) # 返回的找到的元素的索引,如果找不到返回-1
print(a.index('sdj',1,10)) # 返回的找到的元素的索引,找不到报错。
## split 以什么分割,最终形成一个列表此列表不含有这个分割的元素。
ret = words.split(' ')
print(ret)
ret = words.rsplit(' ',2)
print(ret)
## format的三种玩法 格式化输出
print('{} {} {}'.format('aaron',18,'teacher'))
print('{1} {0} {1}'.format('aaron',18,'teacher'))
print('{name} {age} {job}'.format(job='teacher',name='aaron',age=18))
## strip
a = '****asdasdasd********'
print(a.strip('*'))
print(a.lstrip('*'))
print(a.rstrip('*'))
## replace
print(words.replace('e','a',2))
print(words.isalnum()) #字符串由字母或数字组成
print(words.isalpha()) #字符串只由字母组成
print(words.isdigit()) #字符串只由数字组成
```
### 元祖 tuple
元组被称为只读列表,即数据可以被查询,但不能被修改。
### 列表 list
列表相比于字符串不仅可以储存不同的数据类型而且可以储存大量数据32 位 python 的限制是 536870912 个元素,64 位 python 的限制是 1152921504606846975 个元素。而且列表是有序的,有索引值,可切片,方便取值。
#### 增
```python
li = [1,'a',2,'d',4]
li.insert(0,22) # 按照索引去增加
print(li)
li.append('ddd') # 增加到最后
print(li)
li.extend(['q,a,w']) # 迭代的去增
print(li)
li.extend(['q,a,w','das']) # 迭代的去增
print(li)
```
运行结果
```
[22, 1, 'a', 2, 'd', 4]
[22, 1, 'a', 2, 'd', 4, 'ddd']
[22, 1, 'a', 2, 'd', 4, 'ddd', 'q,a,w']
[22, 1, 'a', 2, 'd', 4, 'ddd', 'q,a,w', 'q,a,w', 'das']
```
#### 删
```python
li = [1,'a',2,'d',4,5,'f']
a = li.pop(1) # 按照位置去删除,有返回值
print(a)
del li[1:3] # 按照位置去删除,也可切片删除没有返回值。
print(li)
li.remove('f')
print(li)
li.clear()
print(li)
```
运行结果
```
a
[1, 4, 5, 'f']
[1, 4, 5]
[]
```
#### 改
```python
li = [1,'a',2,'d',4,5,'f']
li[1] = 'aaa'
print(li)
li[2:3] = [3,'e']
print (li)
```
运行结果
```
[1, 'aaa', 2, 'd', 4, 5, 'f']
[1, 'aaa', 3, 'e', 'd', 4, 5, 'f']
```
#### 查
切片去查,或者循环去查。
#### 其他操作
```python
li = [1,2,4,5,4,2,4]
print (li.count(4)) # 统计某个元素在列表中出现的次数
print (li.index(2)) # 用于从列表中找出某个值第一个匹配项的索引位置
li.sort() # 用于在原位置对列表进行排序
print (li)
li.reverse() # 将列表中的元素反向存放
print (li)
```
运行结果
```
3
1
[1, 2, 2, 4, 4, 4, 5]
[5, 4, 4, 4, 2, 2, 1]
```
### 字典dict
字典是python中唯一的映射类型采用键值对key-value的形式存储数据。python对key进行哈希函数运算根据计算的结果决定value的存储地址所以字典是无序存储的且key必须是可哈希的。可哈希表示key必须是不可变类型数字、字符串、元组。
#### 增
```python
dic = {"age":18, "name":"aaron"}
dic['li'] = ["a","b","c"]
print(dic)
dic.setdefault('k','v')
## 在字典中添加键值对如果只有键那对应的值是none,但是如果原字典中存在设置的键值对,则他不会更改或者覆盖。
print(dic)
dic.setdefault('k','v1')
print(dic)
```
#### 删
```python
dic = {"age":18, "name":"aaron"}
dic_pop = dic.pop('age')
## pop根据key删除键值对并返回对应的值如果没有key则返回默认返回值
print(dic_pop)
dic_pop = dic.pop('sex','查无此项')
print(dic_pop)
dic['age'] = 18
print(dic)
del dic['name']
print(dic)
dic['name'] = 'demo'
dic_pop = dic.popitem()
## 随机删除字典中的某个键值对,将删除的键值对以元祖的形式返回
print(dic_pop)
dic_clear = dic.clear()
## 清空字典
print(dic,dic_clear)
```
#### 改
```python
dic = {"age":18, "name":"aaron", 'sex':'male'}
dic2 = {"age":30, "name":'demo'}
dic2.update(dic)
## 将dic所有的键值对覆盖添加相同的覆盖没有的添加到dic2中
print(dic2)
dic2['age'] = 30
print(dic2)
```
#### 查
```python
dic = {"age":18, "name":"aaron", 'sex':'male'}
value = dic['name']
## 没有会报错
print(value)
value = dic.get('abc','查无此项')
print(value)
```
#### 其他操作
```python
dic = {"age":18, "name":"aaron", 'sex':'male'}
for i in dic.items():
# 将键和值作为元祖列出
print(i)
for key,value in dic.items():
print(key,value)
for i in dic:
# 只是迭代键
print(i)
keys = dic.keys()
print(keys,type(keys))
value = dic.values()
print(value,type(value))
```
### 集合set
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:
- 去重,把一个列表变成集合,就自动去重了。
- 关系测试,测试两组数据之前的交集、差集、并集等关系。
#### 创建集合
```python
set1 = set({1,2,'barry'})
set2 = {1,2,'barry'}
print(set1,set2)
```
#### 集合的增
```python
set1 = {'abc','def',123,'asdas'}
set1.add('qwer')
print(set1)
set1.update('A')
#update迭代着增加
print(set1)
set1.update('哈哈哈')
print(set1)
set1.update([1,2,3])
print(set1)
```
#### 集合的删
```python
set1 = {'abc','def',123,'asdas'}
set1.remove('abc')
print(set1)
set1.pop()
## 随机删除一个数
print(set1)
set1.clear()
## 清空合集
print(set1)
del set1
## 删除合集
print(set1)
```
#### 集合的其他操作
###### 交集(& 或者 intersection
```python
set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7}
print(set1 & set2)
print(set1.intersection(set2))
## 列出两个集合中共同拥有的项
```
##### 并集(|或者 union
```python
set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7}
print(set1 | set2)
print(set2.union(set1))
## 列出两个集合中所有的项
```
##### 差集(- 或者 difference
```python
set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7}
print(set1 - set2)
print(set1.difference(set2))
## 在set1中删除set2中有的项
```
##### 反交集 ^ 或者 symmetric_difference
```python
set1 = {1,2,3,4,5}
set2 = {3,4,5,6,7}
print(set1 ^ set2)
print(set1.symmetric_difference(set2))
## 显示set1和set2不共存的项
```
##### 子集与超集
```python
set1 = {1,2,3}
set2 = {1,2,3,4,5,6}
print(set1 < set2)
print(set1.issubset(set2)) # 这两个相同都是说明set1是set2子集。
print(set2 > set1)
print(set2.issuperset(set1)) # 这两个相同都是说明set2是set1超集
```
##### frozenset不可变集合让集合变成不可变类型
```python
set1 = {1,2,3,4,5,6}
s = frozenset(set1)
print(s,type(s))
s.add(7) # 不可以修改,会报错
```
## 基础数据类型的总结
### 按存储空间的占用分(从低到高)
1. 数字
2. 字符串
3. 集合:无序,即无序存索引相关信息
4. 元组:有序,需要存索引相关信息,不可变
5. 列表:有序,需要存索引相关信息,可变,需要处理数据的增删改
6. 字典无序需要存key与value映射的相关信息可变需要处理数据的增删改
### 按存值个数区分
| 标量/原子类型 | 数字,字符串 |
| -------------- | ---------------- |
| 容器类型 | 列表,元组,字典 |
### 按可变不可变区分
| 可变 | 列表,字典 |
| ------ | -------------------------- |
| 不可变 | 数字,字符串,元组,布尔值 |
### 按访问顺序区分
| 直接访问 | 数字 |
| --------------------- | ------------------ |
| 顺序访问(序列类型) | 字符串,列表,元组 |
| key值访问映射类型 | 字典 |
## 其他forenumeraterange
for循环用户按照顺序循环可迭代对象的内容。
```python
s = '先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。'
for i in s:
print(i)
li = ['甲','乙','丙','丁']
for i in li:
print(i)
dic = {'a':1,'b':2,'c':3}
for k,v in dic.items():
print(k,v)
```
enumerate枚举对于一个可迭代的iterable/可遍历的对象如列表、字符串enumerate将其组成一个索引序列利用它可以同时获得索引和值。
```python
li = ['甲','乙','丙','丁']
for i in li:
print(i)
for i in enumerate(li):
print(i)
for index,value in enumerate(li):
print(index,value)
for index,value in enumerate(li,100): #从哪个数字开始索引
print(index,value)
```
range指定范围生成指定数字。
```python
for i in range(1,10):
print(i)
for i in range(1,10,2): # 步长
print(i)
for i in range(10,1,-2): # 反向步长
print(i)
```