课程简述+趣闻+练习解析
SaturdayForever
·
·
个人记录
3.2 练习 绘制太阳花 代码示例
Python尚进课堂 第二节
主题
- 数值类型 && 类型转化
- 字符串
串讲摘要
- 数值
- 数值类别
- 数值操作(数值运算)
-
类别转换
- 字符串
- 定义、转义
- 索引、切片、步长
- 字典序
-
字符串方法(str的成员函数)
数值
0x789 0o237 'hello luogu!' 1e9+7 [1, 1, 4, 5, 1, 4]
1e-10 {} [] 5+1j
数值类型依次为:
int int str float list float dict(set) list complex
列表和字典的区别:
['这个',['l','i','s','t'],'还蛮大的','放','都可以放','没关系的',233]
{'2un':'touhou','爱手艺':' Cthulhu','idoit':'⑨'}
浮点误差|浮点范围
float占用的内存空间是固定的,表示范围、精度也是有限的。
import sys
print(sys.float_info.max) # min 浮点范围
print(sys.float_info.epsilon)
eps = 1e-13 # 表示误差error
print(1.1 + 2.2 == 3.3) # False
print(abs(3.3 - (1.1 + 2.2) < eps) # True
浮点数比较的正确食用方法:使用误差 eps 和 绝对值 abs
数值运算
优先级从高到低,同级从左到右。
特例:
赋值号(单等号):先计算右边的值,然后赋给左边的变量。(左边一定是变量)
a = b = c = 3
乘方号 举栗子: 2^{3^{3^{3^{3^{3^3}}}}} 这是一个指数塔。
如果从左往右计算 即为 (((((2^3)^3)^3)^3)^3)^3 也就是 2^{3*3*3*3*3*3}
。显然 3*3*3*3*3*3 < 3^{3^{3^{3^{3^3}}}},完全不是一回事。
可知指数塔从右往左计算是数学规定的,python只负责实现罢了。a = 2**3**3**3**3**3**3
练习
小z的疑惑
当循环次数不确定时选while循环
整数还是浮点?
浮点数的比较方式?
[代码示例](https://www.luogu.com.cn/paste/f5iraczm)
#### 计算器
> eval()
代码示例:
```python
print(eval(input()))
```
## 字符串
同样的混个脸熟吧
```python
'happy sugar life'
"Coin Collecting Foundation'
"中二电视台观众:\n台长你"新十万三"到底什么时候能更?"
""""-'-test"-'"""
```
以上依次为 合法,不合法,不合法,合法字符串。 ~~你说这个这谁懂啊啊~~
可知字符串至少两边要有成对引号。 ~~你这不是废话~~
### 引号
```python
'单引号字符串可以有"双引号"'
"双引号字符串可以有'单引号'"
'''三引号换行
'单'"双"引号都没问题'''
```
建议一律三引号,以上。
### 转义字符
~~有三引号就不需要了~~
但是选填可能会考你。所以………至少记下
>反斜杠\
>
>\n回车
### 索引、切片、步长
内置函数 $len()$ 返回字符串长度,设 $length$ 为字符串长
$a[k]$ 访问第 $k+1 $个字符 $(0\leq k < length)
a[-s]$ 访问倒数第 $s$ 个字符 $(0 < s \leq length)
### ASCII编码
$ord('0') = 48$ 返回单字符的编码
$chr(48) = '0'$ 返回编码对应字符
128号:0-127 那么为什么是128?
0-9 10个,
a-z 26个,
A-Z 26个,
$10+26+26=62$个字符 再加逗号、句号、叹号、问号……成功超过了64个,也就就是说 6bit 不够编,便采取 7bit 编排,这下够了还空出了前面几个,便发挥脑洞随便填填 ,所以才会有看起来开头有点奇怪的 ASCII 表。
### 字典序
两个字符串比较 $A < B$ 返回什么呢?毫无疑问是bool类型: True/False
答案是False 0 模拟带入一次试试看~
```python
A = 'reimu marisa aya sanae cirno mystia'
B = 'reimu marisa aya sanae cirno marisa'
C = 'reimu marisa aya sanae cirno'
length = min(len(A),len(B))
end = 0
for i in range(length): #利用索引遍历
if ord(A[i]) < ord(B[i]):
print(1)
end = 233
break
elif ord(A[i]) > ord(B[i]):
print(0)
end = 233
break
if end == 0:
if length == len(A):
print(1)
else:
print(0)
```
那么 $B < C$ 会返回 True 吗?False
### str方法
#### 一行里多个数据的读入
**分裂**
``A.split(sep = ' ',n = -1) ``
括号里留空,默认分隔符空格,次数不限。
可指定分隔符 $sep$,也可指定分成 $n+1$ 字符串,组成列表返回。
#### 替换
``A.replace('old','new'[,count])
``
将字符串中所有'old'子串替换为'new'子串,若传了参数count,则前count个被替换。仿交互式情境如下:
```
>>>A = 'reimu marisa aya sanae cirno mystia'
>>>A.replace('mystia','yuyuko')
'reimu marisa aya sanae cirno yuyuko’
>>>
```
#### 查找子串
``A.find('sub'[,start[,end]])
``
从下标start到end-1查找子串,返回第一次出现'sub'首位的下标,找不到返回 -1。
```
>>>A.find('mystia')
29
>>>A.find('mystia',12,-1)
-1
>>>
```
### 练习
1切片练习(也不一定,能队就行)
[代码示例](https://www.luogu.com.cn/paste/614sqvtm)
2 split练习(也不一定,能队就行)
[代码示例](https://www.luogu.com.cn/paste/ud2y3fmn)
3 凯撒密码
[代码示例](https://www.luogu.com.cn/paste/y21q6v3u)
---------
枯燥乏味的东西终于是结束了。
最后,来听首歌吧!
