Python十讲 - 第二讲:变量和基础数据类型
本讲主要内容
变量 字符串 数字和运算符 数据类型转换
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