根据python100天学习:https://github.com/jackfrued/Python-100-Days/
记录一下字符串和循环的一些练习
'''
str1 = 'hello, world!'
# 通过内置函数len计算字符串的长度
# print(len(str1)) # 13
# 获得字符串首字母大写的拷贝
# print(str1.capitalize()) # Hello, world!
# 获得字符串每个单词首字母大写的拷贝
# print(str1.title()) # Hello, World!
# 获得字符串变大写后的拷贝
# print(str1.upper()) # HELLO, WORLD!
# 从字符串中查找子串,第一个符合字符的所在位置
# print(str1.find('or')) # 8
# print(str1.find('slll')) # -1 找不到返回-1
# 与find类似但找不到子串时会引发异常
# print(str1.index('or')) # 8
# print(str1.index('shit')) # 报错
# 检查字符串是否以指定的字符串开头
print(str1.startswith('He')) # False
print(str1.startswith('hel')) # True
# 检查字符串是否以指定的字符串结尾
print(str1.endswith('!')) # True
# 将字符串以指定的宽度居中并在两侧填充指定的字符
print(str1.center(21, '*'))
# 将字符串以指定的宽度靠右放置左侧填充指定的字符
print(str1.rjust(21, ' '))
str2 = 'abc123456'
# 检查字符串是否由数字构成
print(str2.isdigit()) # False
# 检查字符串是否以字母构成
print(str2.isalpha()) # False
# 检查字符串是否以数字和字母构成
print(str2.isalnum()) # True
str3 = ' jackfrued@126.com '
print(str3)
# 获得字符串修剪左右两侧空格之后的拷贝
print(str3.strip())
'''
a, b = 5, 10
print('%d * %d = %d' %(a,b,a*b))
print('{0} * {1} = {2}' .format(a, b, a * b))
print(f'{a} * {b} = {a*b}')
#list1 = [1, 3, 5, 7, 100]
'''
for i in range(int(len(list1))):
print('%s %s = %d' %('lst1',[i],list1[i]))
'''
#print(list1) # [1, 3, 5, 7, 100]
# 乘号表示列表元素的重复
#list2 = ['hello'] * 3
#print(list2) # ['hello', 'hello', 'hello']
# 计算列表长度(元素个数)
#print(len(list1)) # 5
# 下标(索引)运算
#print(list1[0]) # 1
#print(list1[4]) # 100
# print(list1[5]) # IndexError: list index out of range
#print(list1[-1]) # 100
#print(list1[-3]) # 5
#list1[2] = 300
#print(list1) # [1, 3, 300, 7, 100]
# 通过循环用下标遍历列表元素
'''
for index in range(len(list1)):
print(list1[index])
'''
'''
# 通过for循环遍历列表元素
for i in list1:
print(i)
'''
# 通过enumerate函数处理列表,遍历可以同时获得元素索引和值
'''
for index, elem in enumerate(list1):
print(index, elem) # 0 1 ;1 3......
'''
list1 = [1, 3, 5, 7, 100]
# 在列表末尾 添加新元素:200
list1.append(200) #[1, 3, 5, 7, 100, 200]
# 在列表前 添加新元素:1,400
list1.insert(1, 400) #[1, 400, 3, 5, 7, 100, 200]
# 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
list1.extend([1000, 2000]) # [1, 400, 3, 5, 7, 100, 200, 1000, 2000]
list2 = [21,22]
list1.pop(0) # pop(index) 删除指定索引对应的元素
list1.remove(100) # remove(num) 删除列表内的某个值,数值,即存在列表的内容
list1.reverse() # reverse() 翻转列表
# 清空列表元素
#list1.clear()
# print(len(list1)) # 计算列表长度:9
# print(list1 + list2) #合并两个列表
'''
# 先通过成员运算判断元素是否在列表中,如果存在就删除该元素
if 3 in list1:
list1.remove(3)
if 1234 in list1:
list1.remove(1234)
print(list1) # [1, 400, 5, 7, 100, 200, 1000, 2000]
# 从指定的位置删除元素
list1.pop(len(list1) - 1)
print(list1) # [400, 5, 7, 100, 200, 1000]
'''
'''
fruits = ['grape', 'apple', 'strawberry', 'waxberry']
fruits += ['pitaya', 'pear', 'mango']
# 列表切片
fruits2 = fruits[1:4]
# print(fruits2) # apple strawberry waxberry
# 可以通过完整切片操作来复制列表
fruits3 = fruits[:]
# print(fruits3) # ['grape', 'apple', 'strawberry', 'waxberry', 'pitaya', 'pear', 'mango']
fruits4 = fruits[-3:-1]
# print(fruits4) # ['pitaya', 'pear']
# 可以通过反向切片操作来获得倒转后的列表的拷贝
fruits5 = fruits[::-1]
# print(fruits5) # ['mango', 'pear', 'pitaya', 'waxberry', 'strawberry', 'apple', 'grape']
list1 = ['orange', 'apple', 'zoo', 'internationalization', 'blueberry']
list2 = sorted(list1)
# sorted函数返回列表排序后的拷贝不会修改传入的列表,默认按照字母升序
# 函数的设计就应该像sorted函数一样尽可能不产生副作用
# reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)
list3 = sorted(list1, reverse=True)
# 通过key关键字参数指定根据字符串长度进行排序而不是默认的字母表顺序
list4 = sorted(list1, key=len) # 根据字符串长度排序
print(list1)
print(list2)
print(list3)
print(list4)
# 给列表对象发出排序消息直接在列表对象上进行排序
list1.sort(reverse=True)
print(list1)
'''
'''
99乘法表
i * j
1 x 1
1 x 2 2 x 2
1 x 3 2 x 3
1 x 9 2 x 9
'''
'''
for i in range(1,10):
for j in range(1,i+1):
print('%d X %d = %d' % (j,i,j*i) ,end = ' ')
'''
list1 = []
list2 = []
for i in range(1,6):
list1.append(i) # [1, 2, 3, 4, 5]
list2.append(i*i) # [1, 4, 9, 16, 25]
f = [x*x for x in range(1 , 6)] # 可以直接生成数组,在1,6范围内 叫生成式语法
f2 = [x+y for x in 'ab' for y in '12'] # 组合生成数组
f3 = [x*x for x in range(1,10) if x%2==0] # 可以加if判断语句
'''
L = [‘Java’ , ‘C’ , ‘Swift’ , ‘Python’ , 123] , 现在有 list 中包含字符串,和整数,把list中得大写字符转为小写,推到出另外一个list”:
1、使用内建的isinstance函数可以判断一个变量是不是字符串
2、s.lower() 可以将一个大写字母转为小写。
3、增加if语句保证列表生成式正确执行。
for i in L i ==> 代表L列表内元素
'''
L = ['Java', 'C', 'Swift' , 'Python' , 123]
l = [ i.lower() for i in L if isinstance(i,str)] # ['java', 'c', 'swift', 'python']
# 生成器 用 ( ),可以不占用很多内存,使用时调用既可以
# 生成式 用 [ ],一般会占用较大内存
g = (x * x for x in range(1,10)) #g : 就是一个生成器
#print(g.__next__()) # 通过调用next函数,来获取下一个内容,当没有内容可获得,则会报错。太麻烦
# 调用for函数,可列举出来
for i in g:
pass
import sys
# 用列表的生成表达式语法创建列表容器
# 用这种语法创建列表之后元素已经准备就绪所以需要耗费较多的内存空间
f = [x ** 2 for x in range(1, 1000)]
# print(sys.getsizeof(f)) # 查看对象占用内存的字节数
# 请注意下面的代码创建的不是一个列表而是一个生成器对象
# 通过生成器可以获取到数据但它不占用额外的空间存储数据
# 每次需要数据的时候就通过内部的运算得到数据(需要花费额外的时间)
f = (x ** 2 for x in range(1, 1000))
# print(sys.getsizeof(f)) # 相比生成式生成器不占用存储数据的空间
# print(f)
for val in f:
pass
'''
# foo 函数 ,打印一串字符 之后进入循环,当为真,res首先是否遇到yield关键字,遇到则可以当作函数中的返回值,返回其后跟的数值
# 之后再打印“res+”数值,由于没有赋值,所以会输出None
# 使用next时需要注意:是接着上一个运行的,不是重新开始,比如第一个next到yield 5 停止了,返回的5,
# 那么第二个next则是接着yield 5下一步print("res+",res)运行的
def foo():
print("starting...")
while True:
res = yield 5 #此处,若没有yield,则会一直循环,输出res:5;因为一直符合true条件;使用yield,停止循环,返回5
print("res+",res)
g = foo()
print(next(g)) #输出第一个g生成器,生成器是遇到了yield,故停止,且返回了数值5,非赋值
print("*"*20)
# 输出生成器下一个内容,属于紧接着上一个next继续,即输出print("res+",res),但由于没有赋值,故,res为None,继续循环,则再次返回5
print(next(g))
# 与上一个nxet一样
print(next(g))
# send函数是指当前生成器内没有内容,使用send传进去一个值,那么res就等于11 。send内含有next方法,也会执行
# 此时若输出,则是res+ 11 之后继续运行,碰到yield关键字,输出5。则结果是==> res+ 11 ; 5
print( g.send(11))
'''
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
yield a
'''
def main():
for val in fib(10):
print(val)
'''
'''
# 定义元组
t = ('骆昊', 38, True, '四川成都')
print(t)
# 获取元组中的元素
print(t[0])
print(t[3])
# 遍历元组中的值
for member in t:
print(member)
person = list(t) # 将元组转换成列表
print(person)
fruits_list = ['apple', 'banana', 'orange']
fruits_tuple = tuple(fruits_list) # 将列表转换成元组
'''
'''
# 创建集合的字面量语法
set1 = {1, 2, 3, 3, 3, 2} # 去除重复值,集合具有唯一性
print(set1)
# 创建集合的构造器语法(面向对象部分会进行详细讲解)
set2 = set(range(1, 10))
set3 = set((1, 2, 3, 3, 2, 1))
print(set2, set3)
# 创建集合的推导式语法(推导式也可以用于推导集合)
set4 = {num for num in range(1, 100) if num % 3 == 0 and num % 5 == 0}
#print(set4)
print(set2 < set1)
jiaoji = set1 & set2
print("交集:",jiaoji)
bingji = set1 | set2
print("并集:",bingji)
cha = set2 - set1
print("差集:",cha)
set1.add(5) # 集合添加元素
print(set1)
set1.update([44]) # 集合添加元素
print(set1)
set2.discard(5) # 集合删除某元素
print(set2)
if 3 in set2:
set2.remove(3)
print(set2)
set3.pop() # 删除集合开始的元素
print(set3)
'''
'''
# 创建字典的字面量语法
scores = {'骆昊': 95, '白元芳': 78, '狄仁杰': 82}
print(scores)
# 创建字典的构造器语法
items1 = dict(one=1, two=2, three=3, four=4)
# 通过zip函数将两个序列压成字典
items2 = dict(zip(['a', 'b', 'c'], '123'))
# 创建字典的推导式语法
items3 = {num: num ** 2 for num in range(1, 10)}
print(items1, items2, items3)
# 通过键可以获取字典中对应的值
print(scores['骆昊'])
print(scores['狄仁杰'])
# 对字典中所有键值对进行遍历
for key in scores:
print(key)
print(f'{key}: {scores[key]}')
# 更新字典中的元素
scores['白元芳'] = 65
scores['诸葛王朗'] = 71
scores.update(冷面=67, 方启鹤=85)
print(scores)
if '武则天' in scores:
print(scores['武则天'])
print(scores.get('武则天'))
# get方法也是通过键获取对应的值但是可以设置默认值
print(scores.get('武则天', 60))
print(scores)
print(scores.popitem()) # 删除字典中的元素,默认删除最后一个元素
print(scores.popitem())
print(scores.pop('骆昊', 100)) # 删除字典中指定元素
print(scores)
# 清空字典
scores.clear()
print(scores)
'''