本讲主要内容
变量
字符串
数字和运算符
数据类型转换
2.1 变量
1. 变量是什么?
变量, 是指把程序运行的中间结果临时的存在内存里, 以便后续的代码调用, 其值可以修改.
在 python 中, 当变量被使用时, 在内存里将产生两个动作, 一是开辟指定地址的空间, 二是赋予指定的变量值.
在 python 语言中, 变量在指定的同时, 必须强制赋初值, 否则解释器报错.
- name # name 变量未赋值, 解释器认为非法, 报未定义错误
- name = 'kidd' # name 变量赋予初值'kidd', 解释器执行通过
这里的 name 为变量名, 其值为'kidd'.Python 变量赋值通过等号 (=) 来实现.
变量建立的结果, 往往被其他代码所使用. 例如:
- x = 1+2+3+4
- print(x) # print 函数打印变量 x 的结果, 输出 10
2. 多个变量赋值
Python 允许同时为多个变量赋值.
- one = two = three = 1
- print(one, two, three) # print 函数允许多值打印输出, 用逗号分隔变量
注: one, two, three 三个变量在内存中指向同一个地址. 也可以按照下面的格式, 给不同的变量名赋值:
- one, two, three = 1, 1, 1
- print(one, two, three) # print 输出值也为三个连续的 1
3. 变量值类型
所有编程语言的变量值都是分类型的, Python 语言变量值的类型在赋值后才被隐性确定.
例如 x = 0, 那么 0 就是整数类型的值; x = 'ok', 那么 ok 就是字符串类型的值; x = True, 那么 True 就是布尔类型的值.
Python 语言的基本变量类型包括字符串, 数字, 列表, 元组, 字典五大类.
注: 变量命名规则
(1)变量只能由字母, 数字, 下划线组成.
(2)不能以数字开头.
(3)不能是 python 中的关键字
(4)大小写区分, a = 1 和 A = 1 是两个变量.
以上要求是必须满足的, 下面的要求要尽量做到
(5)变量名要有描述性, 要简洁, 易读, 不宜过长.
(6)变量名不能使用中文以及拼音.
(7)官方推荐使用的变量名:
下划线: my_name = 'kidd'
驼峰体: MyName = 'kidd'
注: 关于常量
常量, 即不能变的数据对象.
在 python 中, 常量名全部为大写, 且放在文件的最上面.
NAME = 'kidd'
2.2 字符串
字符串, 由任意字节的字符组成, 用单引号 ('), 双引号(") 或三引号 (''') 成对表示.
简单的说, 凡是用引号括起来的就是字符串.
name = 'kidd'
name1 = "kidd"
单双引号配合使用:
s = "I'm kidd"
当一个字符串有多行时, 一般考虑使用三引号:
msg = '''床前明月光,
疑是地上霜,
举头望明月,
低头思故乡.''' 注: 只有引号, 没有字节内容的字符串也是合法的. 例如 name =''
2.2.1 字符串的基本操作
字符串值基本操作包括读取, 合并, 修改, 删除, 查找
1. 字符串值的读取
s = 'Tom is a cat'
代码中的字符串在内存中的存放顺序如下表所示:
s 字符串: | T | o | m | i | s | a | c | a | t | |||
对应下标地址: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
从上表可以看出, 字符串中的每个字符都对应一个下标. 字符串的下标都是从 0 开始.
注: 下面对字符串进行的操作, 形成的都是一个新的字符串, 与原来的字符串没有关系
(1)按照索引取值:[下标].
- s1 = s[2] # 读取下标为 2 的字符
- print(s1)
结果: m
(2)按照切片取值:[左下标: 右下标], 顾头不顾尾.
- s2 = s[4:6] # 读取下标为 4,5 的字符
- print(s2)
结果: is
(3)带冒号省略下标方式切片:[左下标: ],[: 右下标],[ : ].
- s3 = s[: 3] # 读取下标为前三个的字符
- print(s3)
结果: Tom
[: 3] 指的是从字符串的开始, 读到下标为 2 的字符
- s4 = s[9: ] # 读取下标从第 9 到最后的字符
- print(s4)
结果: cat
- s5 = s[:] # 读取整个字符串
- print(s5)
结果: Tom is a cat
(4)负数下标读取: 用负数下标从右到左读取对应的字符串值.
- s6 = s[-1] # 从右往左, 读取右边第一个字符
- print(s6)
结果: t
- s7 = s[-3: -1] # 从右往左, 读取倒数第三个, 倒数第二个字符
- print(s7)
结果: ca
(5)带步长的切片读取:[左下标: 右下标: 步长].
- s8 = s[: : 2] # 从头到尾, 步长为 2, 读取对应字符
- print(s8)
结果: Tmi a
- # 如果想倒序取值, 加一个反向步长(步长前加负号)
- s9 = s[-1:-6: -2]
- print(s9)
结果: tca
注 1:Python 在采用下标读取其他对象值时, 也统一采用类似风格的下标使用方法, 如后面要讲到的列表, 元组等.
注 2: 使用下标时, 超出字符串范围读取值, 解释器将报错.
2. 字符串值合并
对于不同的字符串, 可以通过加号 (+) 进行合并操作
- name = 'kidd'
- job = 'student'
- res = name + ',' + job # 用加号合并三个字符串
- print(res)
结果: kidd, student
注: 字符串值也可以与数字相乘
- s = '锦鲤'
- s1 = s * 6 # 重复显示 6 个锦鲤
- print(s1)
结果: 锦鲤锦鲤锦鲤锦鲤锦鲤锦鲤
3. 字符串值修改
replace: 替换
- s = 'Tom is a cat, Tom...'
- s1 = s.replace('Tom', 'Jack') # 前面为要替换的内容, 后面为替换的内容
- print(s1)
结果: Jack is a cat, Jack...
- # 可以设置替换次数, 但是只能从前往后开始替换
- s2 = s.replace('Tom', 'Jack', 1)
- print(s2)
结果: Jack is a cat, Tom...
- name = 'I am a student'
- new_name = name[: 7] + 'teacher'
- print(new_name)
结果: I am a teacher
上述字符串值的修改, 是通过读取子字符串并合并的方法实现的.
不能直接对字符串做如下修改操作:
name[3] = 'i' # 解释器将报错
4. 字符串值删除
strip: 默认去除字符串前后的空格, 换行符(\n), 制表符(\t)
- name = '\tblame kidd'
- print(name.strip())
结果:'blame kidd' # 加引号是为了区分空格
- # 也可以指定去除的字符
- name = '**blame kidd*'
- print(name.strip('*')) # 去除字符串首尾的 *
结果: blame kidd
- name = 'iwakiddwa'
- print(name.strip('wai'))
结果: kidd
去除字符串前面的空格: lstrip
去除字符串后面的空格: rstrip
- # 应用举例: 登录账户时
- username = input('请输入用户名:').strip()
- if username == 'kidd':
- print('登录成功!')
del: 删除整个字符串值
del(name) # 清楚内存中的 name, 再次调用 name 将报错
说明: del(x)函数函数内存中一个指定的对象 x,x 可以是字符串, 数字, 列表, 元组, 字典, 类等.
5. 字符串值查找
判断以什么为开头: startswith
print(name.startswith('bl')) # 判断是否以 bl 开头
结果: True
print(name.startswith('e', 4)) # 判断第 5 个位置之后的字符串以什么开头
结果: True
print(name.startswith('la', 1, 5)) # 判断第 2 个位置到第 5 个位置的字符串以什么为开头
结果: True
判断以什么为结尾: endswith
与 startswith 用法一致
通过元素找索引, 找到第一个元素就返回索引值, 没有此元素则返回 - 1:find
print(name.find('a'))
结果: 2
print(name.find('d'))
结果: 7
print(name.find('w'))
结果:-1
print(name.find('m', 1, -1)) # find 可以设置查找的字符串的开始位置和结束位置
结果: 3
通过元素找索引, 找到第一个元素就返回其索引值, 没有此元素则报错: index
print(name.index('a'))
结果: 2
print(name.index('w')) # 没有 w, 报错
2.2.2 其它常用操作
1. 获取字符串长度
用 len 函数可以获取字符串长度
- name = 'blame kidd'
- print(len(name))
结果: 10
说明: len(x)函数返回一个对象的长度, x 可以是字符串, 列表, 元组, 字典.
注:
在 python3.6 版本中, 把一个汉字看作一个字符串长度
在 python2.x 版本中, 把一个汉字看作两个字符串长度
2. r/R 原始字符串控制符号
print('D:\back\name') # 字符串里含特殊转移符号,\b, \n
结果: D:ack # 没有使用 r 情况下,\b 转为了退格符, 实现了退一格的效果
- ame # \n 转为了换行符, 实现了其后字母的换行显示
- print(r'D:\back\name')
结果: D:\back\name # 在使用 r 情况下, 字符串原样输出, 转义字符不起作用
3. split: 将字符串分割成列表(str --> list), 默认按照空格分割
- s = 'apple huawei xiaomi'
- l1 = s.split() # 默认按照空格分割
- print(l1)
结果:['apple', 'huawei', 'xiaomi']
- s = 'apple, huawei xiaomi'
- l2 = s.split(',')
- print(l2)
结果:['apple', 'huawei xiaomi']
注意这三个的区别:
- s1 = 'apple huawei xiaomi'
- print(s1.split())
结果:['apple', 'huawei', 'xiaomi']
- s2 = 'apple huawei xiaomi'
- print(s2.split(' '))
结果:['','apple','huawei','xiaomi']
- s3 = ',apple,huawei,xiaomi'
- print(s3.split(','))
结果:['','apple','huawei','xiaomi']
- # 可以设置 split 的分割次数
- s = 'blameliop'
- print(s.split('l', 1))
结果:['b', 'lameliop]
4. join: 自定制连接符, 将可迭代对象中的元素连接起来
- s = 'kidd'
- s1 = '*'.join(s)
- print(s1)
结果: k*i*d*d
5. capitalize: 首字母大写
- name = 'blame kidd'
- print(name.capitalize())
结果: Blame kidd
6. title: 非字母隔开的每个部分的首字母大写
- name = 'blame kidd'
- print(name.title())
结果: Blame Kidd
7. center: 字符串居中, 前后填充自定义的字符
- name = 'blame kidd'
- print(name.center(20, '*'))
结果:*****blame kidd*****
8. upper: 字符串全部大写;;lower: 字符串全部小写
- name = 'Blame Kidd'
- print(name.upper())
结果: BLAME KIDD
print(name.lower())
结果: blame kidd
应用场景: 验证码不区分大小写
- code = 'AjkG'.lower()
- your_code = input('请输入验证码:').lower()
- if code == your_code:
- print('验证成功!')
9. swapcase: 大小写转换
- name = 'BlaMe kiDd'
- print(name.swapcase())
结果: bLAmE KIdD
10. 格式化输出:%,format
- # %s 为格式化字符串;%d 为格式化整数
- name = 'blame kidd'
- age = 18
- print('My name is %s, My age is %d'%(name, age))
结果: My name is blame kidd, My age is 18
format 有三种方式
第一种:
- s1 = '我叫{}, 今年{}'.format('kidd', '18')
- print(s1)
结果: 我叫 kidd, 今年 18
第二种:
- s2 = '我叫{0}, 今年{1}, 我还是叫{0}'.format('kidd', '18')
- print(s2)
结果: 我叫 kidd, 今年 18, 我还是叫 kidd
第三种:
- s3 = '我叫{name}, 今年{age}, 我还是叫{name}'.format(age = '18', name = 'kidd')
- print(s3)
结果: 我叫 kidd, 今年 18, 我还是叫 kidd
11. is 系列
- name = 'kidd123'
- print(name.isalpha()) # 判断 name 是否全部以字母组成
结果: False
print(name.isdigit()) # 判断 name 是否全部以数字组成
结果: False
print(name.isalnum()) # 判断 name 是否以字母或者数字组成
结果: True
12. count: 计数
- name = 'blame kidd'
- print(name.count('d')) # 计算给定字符出现几次, 可以进行切片
结果: 2
来源: http://www.bubuko.com/infodetail-2973999.html