#循环语句
#打印1到10
# print(1,2,3,4,5,6,7,8,9,10)#如果打印大于10个,一个一个输入麻烦
#用while循环实现,当while后面的表达式为真时,则执行while,直达表达式为假时,停止循环
# i=1
# while i<=10:
#     print(i)
#     i+=1#每次自增1,避免死循环
#打印出来效果不一样,全部是换行
# while i<=10:
#     print(i,end="")
#     i+=1#数字全部连着了,没有空格
# else:
#     print("\n","打印完成")
# while i<=10:
#     print(i,sep="",end=" ")#sep参数不起作用原因:print的*objects参数只有一个, 如果有多个就会用seq来分割
                             # print(str1,str2,sep='  ',end='')
#     i+=1#数字全部连着了,没有空格
# a = [1, 2, 3]
# print(*a, sep='- ')#1- 2- 3
#1到100,10个换行
# while i<=100:
#     if i%10==0:
#         print(i)
#     else:
#         print(i,end=" ")
#     i+=1
#for 循环实现
# for i in range(1,11):
#     print(i,end=" ")#1 2 3 4 5 6 7 8 9 10
#当循环次数不确定用while,当循环次数确定用for

#遍历方法
#方法1,
# list1=["甲","乙","丙","丁","戊"]
# for i in range(len(list1)):
#     print(list1[i],end=" ")
#方法2
# for one in list1:
#     print(one,end=" ")#甲 乙 丙 丁 戊

#break跳出循环,continue终止本次循环,继续进行下一次循环
# for i in range(1,10):
#     if i==5:
#         # break#终止循环,后面的语句不执行1 2 3 4
#         # continue#跳出本次循环,后面的语句不执行1 2 3 4 6 7 8 9
#         pass#占位符,后面的语句可以执行
#         print("干得不错哦")
#     else:
#         print(i,end=" ")
# else:#循环本身也可以带有一个else语句,程序正常执行完会执行else里面的语句
#     print("\n循环执行完成")

#用循环实现一个定时器
import time
# for i in range(10,-1,-1):
#     print(f"倒计时{i}秒")
#     time.sleep(1)
#倒计时不在一行中,没有达到预期结果
# for i in range(10,-1,-1):
#     print(f"倒计时{i}秒",end="")#倒计时10秒倒计时9秒倒计时8秒倒计时7秒倒计时6秒倒计时5秒倒计时4秒倒计时3秒倒计时2秒倒计时1秒倒计时0秒
#     time.sleep(1)
#后面打印的需要覆盖前面的,也就是让光标回到行首
# for i in range(2,-1,-1):
#     print("\r",f"倒计时{i}秒",end="",flush=True)##如果倒计时不刷新,可以加上flush=True
#     time.sleep(1)
# else:
#     print("\r",f"倒计时结束",end="")
str1='A girl come in, the name is Jack, level 955'
# str2=str1.split("the name is")
# print(str2)
# print(type(str2))
# print(str2[1].split(",")[0].strip())

# def getName(srcstr):
#     str2=srcstr.split("the name is")[1]
#     str3=str2.split(",")[0].strip()
#     return str3
# print(getName(str1))

#可变不可变类型
#可变类型:地址不变时,里面的值发生改变,但是对应的id不变
#不可变类型:地址不变时,里面的值发生改变,对应的id也改变
#结论:int、float、str、bool是不可变类型;list是可变类型;dict其中value可以是任意类型但是key必须是不可变类型
#关于Python中的可变对象与不可变对象的区别
# def t2(para):
#     para=3
#     print(id(para))
# b='a'  #python中,不可变对象的引用称之为值引用,函数调用变量并修改值时,不会改变原变量的值
# print(id(b))
# t2(b)
# print(b)

# def t2(para):
#     para[0]=3
#     print(id(para))
# b=[1]  #python中,可变对象的引用称之为地址引用,函数调用该变量并修改值时,也会改变原变量的值,id 不变
# t2(b)
# print(b)
# print(id(b))

# def t2(para):
#     para=3
#     print(id(para))
# b=[1]  #函数中重新赋值了一个变量,和原变量没有什么联系
# t2(b)
# print(b)
# print(id(b))

#不可变对象实例
#性质1:
#首先,看一下int类型:
# a=1
# b=1
# c=a+0
# print(a is b)
# print(a is c)
#is是对两个变量的id是否相等做出判断如果相等那么返回true 否则返回false
#可以发现上述代码最终结果是打印了两个true

a1 = [1, 2, 3]
a2 = a1
print(id(a1), id(a2))
# 实际上是a2指向了新的对象,id已经改变。
# 所以现在a2、a1并不是同一对象的两个引用了,a2变化a1不会改变
a2 = a2 + [4] # 这个等式中,右边的a2还是和a1的id一样的,一旦赋值成功,a2就指向新的对象
print(id(1), id(a2))  # 不等,a2的id变化了
print(a2)
print(a1) # [1, 2, 3]没有变

a1 = [1, 2, 3]
a2 = a1
print(id(a1), id(a2))
a2 += [4]  # 相当于调用了a2.extend([4]),原地改变并没有新的对象产生
print(id(a1), id(a2))  # 相等,a2的id没有变化
print(a2)
print(a1)