python学习No3
字符串
字符串的表示方式
在python中,可以使用一对单引号、一对双引号或者一对三个双引号、一对三个单引号表示字符串
a=‘hello’
b=’‘hello’’
c=""“hello”""
d=’’'hello
#双引号和单引号的使用
#这是报错代码m="xiaoming said:"I am xiaomong ""
#原因是"" ""两两配对,I am xiaoming 就不被认为是字符串了
#可以如下表示
m='xiaoming said:"I am xiaoming"'
转义字符
’ =========> 显示一个普通的单引号
" =========>显示一个普通的双引号
\n =========>表示换行
\t ==========>表示一个制表符
字符串的下标和切片
下标又称索引,表示第几个数据
可迭代对象都可以遍历(str list tuple dict set range)
str list tuple 可以通过下标获取或者操作数据
在计算机中,下标都是从0开始,可以通过下标获取或者修改指定位置的数据。但字符串是不可变数据类型,对于字符串的任何操作都不会改变原有字符串。
#下标操作
word ='zhangsan'
print(word[4])#输出了g
#切片操作 m[start:end:step] 包含start没有end
#step是步长,理解为间隔,不能为0,可以是负数
m='abcdefghijklmn'
print(m[2:9])#cdefghi
print(m[2:9:2])#cegi
print(m[9:2:-1])#jihgfed
字符串的常见操作
长度
#使用内置函数len可以获取字符串的长度
m='abcdefghijklmn'
print(len(m))
#让字符串以指定长度显示,如果长度不够,默认在右边使用空格补齐
#超过指定长度原样打印
#ljust(width,fillchar)fillchar 默认为空格可以改变
print('Monday'.ljust(10)) #Monday
print('Monday'.ljust(10,'*')) #Monday****
print('Monday'.rjust(10))#右对齐
print('apple'.center(20))#居中
查找
#查找内容相关的方法 find/index/rfind/rindx 可以获取指定字符下标
print(m.find('l'))
print(m.index('l'))
print(m.find('p'))#如果字符在字符串中不存在,结果为-1
print(m.index('p'))#使用index,字符在字符串中不存在,会报错
#rfind和rindex和这两个用法类似,唯一不同在于字符串中有多个相同字符时,
#会找出最大下标
in 和not in
#判断用户输入的字符在字符串中是否存在
word='hello'
x=input('请输入一个字符')
for c in word:
if x==c:
print("输入存在")
break
else:
print("输入不存在")
if word.find(x)==-1:
print('输入不存在')
else :
print('存在')
if x in word:
print('存在')
else:
print("不存在")
查找相关函数的操作是ctrl+鼠标按住函数名称
判断
判断的是字符串内容是否为数字/字母/等等
#startswith,endswith,isalpha,isdigit,isalnum,isspace
#is开头的内置函数就是判断,结果时布尔类型
print('hello'.startswith('he') )#判断开头字符
print('hello'.endswith('o'))#判断结尾
print('he45llo'.isalpha())#判断是否为字符串/字符
print('good'.isdigit())#是否为数字
print('1234ddd'.isalnum())#判断是否由数字或字母组成
print(' '.isspace() )#是否全部是空格
替换
word='hello'
a=word.replace('l','x')
print(word)#字符串不可变
print(a)
内容分割
split:可以将一个字符串切割成一个列表
rsplit:与split用法相同,就是切割时从右向左切
x='a-b-c-d-e-f-g'
y=x.split('-')
print(y)#['a', 'b', 'c', 'd', 'e', 'f', 'g']
print(x.split('-',2))#['a', 'b', 'c-d-e-f-g']
print(x.rsplit('-',2))#['a-b-c-d-e', 'f', 'g']
splitlines:换行符作为分割
m='hello\nworld'
print(m.splitlines() )
partition 指定一个字符串作为分割符,分为三部分的 元组
print('abcdefgHaaaaa'.partition('H') )#('abcdefg', 'H', 'aaaaa')
将列表转换为字符串
word=['a','b','s','d','f']
print('-'.join(word))
修改大小写
capitalize:让第一个单词的 首字母大写
print('hello'.capitalize() )
print('hello.good'.capitalize() )
print('hello\ngood'.capitalize() )
upper:所有字母大写
print('hello'.upper())
lower:所有字母小写
print('Wofda'.lower())
totle:每个首字母大写
print('good morning'.title())
去掉空格
print(' apple '.lstrip())#去左边
print(' apple '.rstrip())#去右边
print(' apple '.strip())#都去
字符与编码
字符和数字编码存在对应关系,可使用chr和ord查看数字和字符对应关系
print(ord('a'))
print(ord('你'))
print(chr(65))
格式化打印字符串
可以使用%占位符表示格式化一个字符
%s 是字符串占位符
%d是整数占位符
%f是浮点数占位符
name='张三'
age=13
print('大家好,我的名字是',name,'我今年',age,'碎了')
#大家好,我的名字是 张三 我今年 13 碎了
print('大家好,我的名字是',name,'我今年',age,'碎了',sep='')
#大家好,我的名字是张三我今年13碎了
print('大家好,我的名字是%s,我今年%d碎了'%(name,age))
#大家好,我的名字是张三,我今年13碎了
format用法
{ }什么都不写,自动占位
x='大家好我是{},今年{}'.format('张三',18)
print(x)
{数字} 根据数字的顺序进行填入。从数字0开始
y='大家好,我是{1},我今年{0}岁了'.format(20,'jerry')
print(y)
{变量} 一一对应
x='大家好,我是{name},今年{age}碎了'.format(age=18,name='李四')
print(x)
python 中的快捷键(使用的pycharm)
- 双击 shift 会弹出全局搜索功能 (jetbrains开发工具大多都有)
如何关闭:双击shift打开—>actions----->registry–>找到ide.suppress.double.click.handler 选项,勾选
(ctrl+shift+A也能打开) - 快速格式化代码 ctrl +alt+l
- 快速复制粘贴的代码 ctrl+d
- 快速移动一行代码 ctrl+shift+上下箭头
- 改变快捷键方式
在keymap中搜索即可(需要英文功底qaq) - 光标前后移动 fn+左右箭头
- 多行注释掉 ctrl+/
列表
列表基本使用
当有多个数据需要按照一定顺序保存时,考虑用列表
1.使用中括号[]表示列表,列表里的每一个元素称之为元素,元素之间用逗号分割
2.使用list内置类,可将可迭代对象转换为一个列表
3.和字符串一样,都可以使用下标获取元素和对元素进行切片,但是列表可以改变元素值
names=['张三','李四','王五','六','七']
print(names)
name=list(('yi','er','san','si'))
print(name)
name[0]='qi'
print(name)
print(name[1:5])
列表的操作
增删改查
1.增加
heros=['花木兰','马超','韩信','露娜','赵云','李元芳',]
heros.append('铠')
print(heros)#append在列表最后追加一个数据
heros.insert(3,'李白')#在指定位置加入某数据
print(heros)
x=['马可波罗','米莱迪','狄仁杰']
#A.extend(B)将可迭代对象B添加到A
heros.extend(x)#拼接可迭代对象
print(heros)
print(x)
2.删除
删除有三个相关方法:pop remove clear
#pop方法默认删除列表里最后一个数据,并且返回这个数据
#pop还可以传入index参数,用来删除指定数据位置的数据
heros=['花木兰','马超','韩信','露娜','赵云','李元芳']
heros.pop(3)#删除heros[3]
print(heros)
#remove删除指定数据
heros.remove('李元芳')
heros.remove('赵云')
#clear 删除全部清空
heros.clear()
print('----')
print(heros)
删除列表中字符串
words = ['hello', 'good', '', '', 'ys', '']
for word in words:
if word=='':
words.remove(word)
print(words)#['hello', 'good', 'ys', '']
#最后一个没删掉,原因是在用for...in循环遍历时,元素改变了,所以
#以后用到for遍历,最好不要对元素进行增删操作
i=0
while i<len(words):
if words[i]=='':
words.remove(words[i])
i=i-1#由于列表元素值变化所以i也变化
i=i+1
print(words)
#方法三:
words = ['hello', 'good', '', '', 'ys', '']
words2=[]
for word in words:
if word!='':
words2.append(word)
words =words2
print(words)
3.查询
#查询
heros=['花木兰','马超','韩信','露娜','赵云','李元芳']
print(heros.index('花木兰'))
print(heros.count('马超') )
print('马超' in heros)
4.修改
heros=['花木兰','马超','韩信','露娜','赵云','李元芳']
heros[2]='铠'
print(heros)
列表的遍历
遍历针对的是可迭代对象
while 循环遍历/for… in循环遍历
heros=['花木兰','马超','韩信','露娜','赵云','李元芳']
for h in heros:#本质是不断调用迭代器的next方法
print(h)
#交换两个变量的值
#方法1:
a=12
b=13
c=b
b=a
a=c
#方法二:
a=a+b
b=a-b
a=a-b
#方法三:
a=a^b
b=a^b
a=a^b
#方法四(python特有
a,b=b,a
冒泡排序
num=[9,8,7,6,5,4,3,2,1]
i=0
while i<10:
i=i+1
n = 0
while n < len(num) - 1:
if num[n] > num[n + 1]:
num[n], num[n + 1] = num[n + 1], num[n]
n += 1
print(num)
num=[9,8,7,6,5,4,3,2,1]
for i in range(0,len(num)-1):
for j in range(0,len(num)-1-i):
if num[j]>num[j+1]:
x=num[j ]
num[j]=num[j+1]
num[j+1]=x
print(num)
列表的排序
num=[9,29,3,4,56,7,8]
num.sort()#调用列表sort方法
print(num)
num=[9,29,3,4,56,7,8]
num1=sorted(num)#内置函数sorted不会改变原有数据,会生成新的有序数据
print(num1)
列表的反转
names=['zhangsan','lisi','wangwu']
names.reverse()
print(names)
列表的复制
pyhnon的数据分为可变类型和不可变类型
不可变:字符串、数字、元组
可变:列表、字典、集合
不可变数据类型,如果修改值,内存地址会发生变化
可变数据类型,修改值,内存地址不会发生改变
(使用内置函数id获取变量内存地址)
a=12
b=a
print('修改前,a={},b={}'.format(id(a),id(b)))
a=10
print(b)
print('修改后,a={},b={}'.format(id(a),id(b)))
而列表的地址则不变
num1=[100,200,300]
num2=num1
print('修改前的num1=%x,num2=%x'%(id(num1),id(num2)))
num1[0]=1
print(num2)
print('修改后的num1=%x,num2=%x'%(id(num1),id(num2)))
列表的浅复制
x=[100,200,300]
y=x#y和x指向同一空间,会相互影响
x[0]=1
print(y)
#现要求改变y的同时x不变,两者不相互影响
#调用copy方法,可以复制一个列表
#这个列表和原有列表一样,但是指向不同内存空间
x=[100,200,300]
z=x.copy()
z[0]=1
print(x)
print(z)
#除了使用列表自带的copy方法以外,还可以使用copy模板实现拷贝
import copy
a=copy.copy(x)#效果等价于x.copy(),都是浅拷贝
#切片就是一个浅拷贝
num1=['a','b','c']
num2=num1[::]
num1[0]='dd'
print(num1,num2)
列表的嵌套
一个学校,有3个办公室,现有10位老师等待工位分配,请编写程序,完成分配
import random
teachers=['a','b','c','d','e','f','g','h','i','j']
rooms=[[],[],[]]
for teacher in teachers:
room=random.choice(rooms)#choice 从列表里随机选择一个数据
room.append(teacher)
print(rooms)
#第0房间有n个人,分别为
for room in rooms:
print('房间里一共有%d个老师'%len(room))
for teacher in room:
print(teacher,end='\t')
print()
#打印下标
for i, room in enumerate (rooms):
print('房间%d里一共有%d个老师'%(i,len(room)))
列表推导式
作用:使用简单语法创建一个列表
nums=[i for i in range(10)]#极简语法
print(nums)
#等价于
nums=[]
for i in range(10):
nums.append(i)
y=[i for i in range(10) if i %2==0]
print(y)
写一个列表[1,2,3,4,5…,100]变成[[1,2,3],[4,5,6]…]
y=[i for i in range(10) if i %2==0]
print(y)
m=[i for i in range(1,101)]
print(m)
n=[m[j:j+3] for j in range(0,100,3)]
print(n)