'''--------容器的特点和容器的操作--------------------------------------------------------'''
#容器的本质目的:减少变量名,统一管理元素
#1、为什么学习容器类型?有什么作用?
#之前的变量类型都只能存储单一元素。
# 若需要定义的变量数过多,将所有的元素放在同一个容器中,一个容器变量就可以存储多个元素,减少了变量的定义
#2、为什么容器类型提供了多个类型?
#每个容器针对了不同的使用场景:有的容器方便操作、有的查询效率高、有的可以保证元素唯一、有的可以保证数据只读等等。
'''多种容器根据 存储数据 的特点,分为 序列式容器 和 非序列式容器'''
#1、序列式容器:存储元素时 是连续存放的。包括 字符串、列表、元组
#序列式容器支持根据下标(索引)存取元素【序列式容器的索引都是从0开始的,不是从1】
#2、非序列式容器:存储元素时 不是连续存放的。包括 字典、集合
"""字符串(容器)的定义及操作--------------------------------------------------------------"""
'''一、如何定义字符串:使用一对 单引号、双引号、三引号(较少使用) 来进行定义。----------------------------'''
my_str='hello'
my_str="hello"
# my_str="""
# hello
# world
# """
'''二、字符串的操作---------------------------------------------'''
'''1、字符串取值。取某一个位置的值----------------------------------------------------------'''
'''索引支持正数索引(从左到右0开始),也支持负数索引(从右到左-1开始)'''
#【hello每个元素正数索引为01234】
print(my_str[1]) #0是索引,即取e字符串中索引为0的元素。返回值为:e
#【hello每个元素负数索引为-5,-4,-3,-2,-1】
print(my_str[-4]) #-4索引对应的元素为e
'''2、字符串遍历。遍历:不重复地访问容器中的每一个元素----------------------------------------------------'''
#通过while循环进行遍历
my_str="hello"
a=0
while a<=4:
print(my_str[a],end=(' ')) #若不设置end,默认每个字母输出都会换行。设置end中为空格/为空,会在每个字母中空格/无间隙
a+=1 #返回值为h e l l o
#通过for循环进行遍历
my_str="hello"
for a in my_str: # a 每次都到容器 my_str 里面 按序 取一个元素,再 print 该元素。之后进行循环,直都取完。
print(a,end=" ")
#while循环次数由条件决定;for循环的循环次数由容器元素个数决定,控制容器元素个数就可以控制循环次数
'''3、字符串替换:replace【字符串专属方法】-----------------------------------------------------'''
poetry="此曲只应天上由,人间难得几回闻,由"
#replace不会替换原本的字符串,而是替换完毕后返回一个新的字符串。【python中字符串原本数据不允许修改,所以会返回新字符串】
new=poetry.replace('由','有',1) # 1 表示替换一次错误的字符
print(poetry) #原字符串:此曲只应天上由,人间难得几回闻,由
print(new) #新字符串:此曲只应天上有,人间难得几回闻,由
#replace是字符串容器专属方法(函数),调用时用"字符串名.replace"【字符串通过点的方式调用专属方法】
'''字符串特点:
1、字符串一旦定义,不允许修改
2、字符串容器中的元素都是字符类型的
'''
'''4、字符串切片【切片语法是:左闭右开】:用于获取字符串中的字串(截取)---------------------------------------'''
user_email='123456789@126.com' #分别显示邮箱名和域名
#find字符串专属方法:返回字串第一次出现的位置;若查找不到,返回-1
#user_email.find('@') 查找@第一次出现的位置,返回值为@所在索引
print(user_email[0: user_email.find('@')]) #返回:123456789。用冒号表示截取多少到多少索引的子串
#从最开始获取字串时,可以省略起始值0:[: user_email.find('@')]
string_lenth=len(user_email) #获得容器中元素的个数
print(user_email[user_email.find('@')+1 : len(user_email)]) #显示@之后的域名,结果为:126.com
#获取字串到结尾位置时,可以省略结束值长度:[user_email.find('@')+1 : ]
'''
省略起始值,表示从0开始;省略结束值,表示取到最后
省略起始值和结束值,表示获取整个字符串,写为print(:),结果为:123456789@126.com
步长设置:默认为1,可以设置其他值
起始值、结束值、步长都可以为负数【步长负数表示倒着取:字符串逆序】
'''
print(user_email[::1])#或者:print(user_email[:]):返回完整字符串结果:123456789@126.com
print(user_email[::2]) #步长为2,返回值:1357916cm(每隔两个取一个元素)
print(user_email[6:1:-1])#从索引6,取到索引1,字串倒着取。所以起始值和结束值也要倒过来;值为:76543
print(user_email[::-1])#结果为:moc.621@987654321
print(user_email[-1:-3:-1])#结果为:mo
print(user_email[-3:-1:1])#结过为co
print(user_email[3:1:-1])#结果为:43
#起始值和结束值谁在前,谁在后,跟步长的正负有关
#步长为正数,从左往右取:起始值和结束值分别为:1——5或者-5—— -1
#步长为负数,从右往左取:起始值和结束值分别为:5——1或者-1——-5
'''邮箱案例完整代码( 切片法 find+ [起始值:结束值] )----------------------------------------------------'''
user_name='nicoley@wicresoft.com'
position=user_name.find('@')
if position== -1:
print('查找不到此邮箱')
else :
print('邮箱前缀为:%s'%user_name[:position])
print(('邮箱域名为:%s'%user_name[position+1:]))
#返回结果为:邮箱前缀为:nicoley 邮箱域名为:wicresoft.com
'''邮箱案例完整代码( split拆分法+[起始值:结束值] )----------------------------------------------------'''
# 给一个参数(分割符sep),以参数为中心,进行前后拆分,例如:
my_sep='aa#bbqqq#cccd#ggggg'
ret=my_sep.split('#')
print(ret) #结果为:['aa', 'bbqqq', 'cccd', 'ggggg']
#拆分形成的结果类似于列表,每个保存的元素也有对应的索引
print(ret[2:]) #结果为:['cccd', 'ggggg']
邮箱案例的拆分法:
user_name='nicoley@wicresoft.com'
number=user_name.count('@') #count计算字符串中某个字符出现的次数,可以用于校验邮箱是否合法
ret=user_name.split("@")
if number==1:
print('邮箱前缀为:%s'%ret[0])
print('邮箱域名为:%s'%ret[1]) #结果为:邮箱前缀为:nicoley ;邮箱域名为:wicresoft.com
else:
print('邮箱中@字符个数不为1,格式无效')
'''5、字符串去除两侧空格,是否为字母----------------------------------------------------------'''
#例如,用户注册用户名,需要去除两侧空格,并且校验用户名是否全部为字母;都满足则显示注册成功
while True:
user_name=input('请输入您的用户名:')
user_name=user_name.strip() #strip方法专门用于去除两侧空格
if user_name.isalpha(): #判断字符串中是否全为字母【发现汉字还是可以注册成功】
print(' %s 注册成功!'% user_name)
else:
print('用户名中含有非法字符!')