我的python之路【第二章】循环-内置方法-数据类型

一、判断表达式:if...elif...else

用法:

if <条件>:

  .....

else:

  ....   

 我们先写一个简单的小程序,熟悉一下

#liuhao
#if else简单应用
#场景一、用户登录验证
import getpass
name = input("请输入用户名:")
pwd= input("请输入密码")
#使用getpass模块隐藏用户输入密码,但是pycharm不支持~
#pwd=getpass.getpass("请输入用户名")
if name=='alex' and pwd=='123':
    print("验证通过")
else:
    print("验证失败")

场景二、猜年龄游戏

在程序里设定好你的年龄,然后启动程序让用户猜测,用户输入后,根据他的输入提示用户输入的是否正确,如果错误,提示是猜大了还是小了。

这个程序你可以先尝试自己去写一下,

age=25
guess_age=int(input("请尝试猜一下alex的年龄~有惊喜啊!").strip())
if guess_age ==25:
    print("你好牛啊,真的猜出来了。你们是不是搞基呀?")

elif guess_age >25:
    print("你也太坏了,alex年纪有那么大吗?")

elif guess_age<25:
    print("你猜的太小啦~")
View Code

你会发现,这个程序运行有些问题,程序每次运行我只能猜一次年龄。如果我们想猜多次呢?

二、for 循环

最简单的for循环示例:

#liuhao
#打印 0-9
for i in range(10):
    print(i)


#输出:
0
1
2
3
4
5
6
7
8
9
View Code
continue的用法:
范例1:循环打印0-9,当打印到5的时候跳过,不打印5.
#打印 0-9
for i in range(10):
    if i==5:
        continue    #跳过此次循环,进行下一次循环
    print('loop:',i)

范例2:还是这个程序,当遇到5时不进行打印,直接退出当前循环。

#打印 0-9
for i in range(10):
    if i==5:
        break    #执行退出当前循环
    print('loop:',i)

范例3:内外两层循环,进行内循环

#打印 0-9
for i in range(10):
    if i==5:
        for i in range(10):
            print("inloop:",i)
            if i ==5:
                break
        continue
    print('outloop:',i)

执行结果:

outloop: 0
outloop: 1
outloop: 2
outloop: 3
outloop: 4
inloop: 0
inloop: 1
inloop: 2
inloop: 3
inloop: 4
inloop: 5
outloop: 6
outloop: 7
outloop: 8
outloop: 9
View Code

三、while 循环

范例1:无限循环

count=0
#这就是一个死循环,while 判断 True 就是真,每一次循环都是真
while True:
    print("就是死循环,",count)
    count+=1

范例2:循环100次,程序退出

#liuhao
count=0
while True:
    print("就是死循环,",count)
    if count== 100: #判断循环到100,执行退出
        break
    count+=1

练习题:如何实现让用户不断的猜年龄,但只给最多3次机会,再猜不对就退出程序,猜对了,直接退出。

#liuhao
count=0
while count<3:
    age=25
    guess_age=int(input("请尝试猜一下alex的年龄~有惊喜啊!").strip())
    if guess_age ==25:
        print("你好牛啊,真的猜出来了。你们是不是搞基呀?")
        break
    elif guess_age >25:
        print("你也太坏了,alex年纪有那么大吗?")

    elif guess_age<25:
        print("你猜的太小啦~")
    count+=1
View Code

 

四、字符串操作:特性不可修改

name="my name is alex"  #设置一个字符串。
#字符串的首字母大写
print(name.capitalize())
#输出:
My name is alex
#统计字符串种单个字符'a'的个数
print(name.count('a'))
#输出
2
#一共打印50个字符,字符串居中,字符个数不足50的位置用#补全
print(name.center(50,'#'))
#ljust,rjust.定义50个字符,字符串一个居左,一个居右对齐
print(name.ljust(50,'*'))
print(name.rjust(50,'*'))
#输出
#################my name is alex##################
my name is alex***********************************
***********************************my name is alex
#expandtabs()设置一个\t特殊字符,代表距离为多少个字符
a="a\tb"
#代表一个tab为30个字符的距离
print(a.expandtabs(30))    
#输出:
a                             b
#find,获取字符的位置
print(name.find("is"))    #获取is在name中的(字符位置-1),
print(name[0:name.find("is")])    #对字符进行切片
#输出:
#8
#my name 这里还发现name后面还有一个空格。
#rfind找到最后一个值得下标返回
print('alex lil'.rfind('l'))
#format格式化输出
a="this is {name},he is {age}"
print(a.format(name="alex",age=33))
#字典格式化输出
print(a.format_map({'name':'liuhao','age':'23'}))
#输出:
#this is alex,he is 33
#this is liuhao,he is 23

以下是str格式进行判断的函数,返回的为布尔类型

#判断字符串的结尾是不是ex,返回布尔值
print(name.endswith("ex"))
#判断是否为数字或字母。不能有特殊字符。返回布尔值
print('2222'.isalnum())
#判断只为字符,返回布尔值
print("abA".isalpha())
#判断是不是一个整数,常用
print("2222".isdigit())
#判断是不是一个合法的标识符,字符和_开头
print('d77sss'.isidentifier())
#判断为小写
print('a'.islower())
#判断是不是每个首字母大写
print("I Am Is".istitle())
#字符串join用法,用前面的填充后面的
print("666is ".join("===="))
print('+'.join(['1','2','3']))
#将前面的字符,分割加入到后面
#输出
#=666is =666is =666is =
#1+2+3
#全部变小写,全部变大写
print('Alex'.lower())
print('Alex'.upper())
#输出
#alex
#ALEX
#去掉两边的换行符strip()
#去掉左边的换行符,lstrip#rstrip去掉右边的换行符
print('\nAlex'.lstrip())
#输出
#Alex
#编码,将前面的字符进行加密。与后面的密码集进行对应。
p=str.maketrans("abcdef",'123456')
print("alex li".translate(p))
#输出
#1l5x li
#replace替换,将l替换为L,只替换一个
print('alex li'.replace('l','L',1))
#输出
#aLex li
#分割,将字符串分割为列表,默认为空格
print('al ex dd li l ss'.split())
print('1+2+3+4'.split('+'))
#字符串大小写转换
print('Alex Li'.swapcase())
#输出:
#['al', 'ex', 'dd', 'li', 'l', 'ss']
#['1', '2', '3', '4']
#aLEX lI

全部整体脚本测试:

#liuhao

name="my name is alex"
#首字母大写
print(name.capitalize())
#统计字符的个数
print(name.count('a'))
#一共打印50个字符,不够的用#补全
print(name.center(50,'#'))
#ljust,rjust.定义50个字符,不够的填充
print(name.ljust(50,'*'))
print(name.rjust(50,'*'))
#设置\t距离为多少个字符
a="a\tb"
print(a.expandtabs(30))
#find,获取字符的位置
print(name.find("is"))
print(name[0:name.find("is")])
#format格式化输出
a="this is {name},he is {age}"
print(a.format(name="alex",age=33))
#字典格式化输出
print(a.format_map({'name':'liuhao','age':'23'}))
#判断结尾是不是ex,返回布尔值
print(name.endswith("ex"))
#判断是否为数字+字母。不能有特殊字符。返回布尔值
print('2222'.isalnum())
#判断只为字符,
print("abA".isalpha())
#判断是不是一个整数,常用
print("2222".isdigit())
#判断是不是一个合法的标识符,字符和_开头
print('d77sss'.isidentifier())
#判断为小写
print('a'.islower())
#判断是不是每个首字母大写
print("I Am Is".istitle())
#字符串join用法,用前面的填充后面的
print("666is ".join("===="))
print('+'.join(['1','2','3']))
#全部变小写,全部变大写
print('Alex'.lower())
print('Alex'.upper())
#去掉左边的换行符,lstrip#rstrip去掉右边的换行符
print('\nAlex'.lstrip())
print('-------')
#去掉两边的换行符strip()
#编码,
p=str.maketrans("abcdef",'123456')
print("alex li".translate(p))
#replace替换,将l替换为L,只替换一个
print('alex li'.replace('l','L',1))
#rfind找到最后一个值得下标返回
print('alex lil'.rfind('l'))
#分割,将字符串分割为列表,默认为空格
print('al ex dd li l ss'.split())
print('1+2+3+4'.split('+'))
#字符串大小写转换
print('Alex Li'.swapcase())
View Code

测试结果

C:\Users\liuhao\AppData\Local\Programs\Python\Python35\python.exe C:/Users/liuhao/PycharmProjects/s16/day2/str_字符串函数.py
My name is alex
2
#################my name is alex##################
my name is alex***********************************
***********************************my name is alex
a                             b
8
my name 
this is alex,he is 33
this is liuhao,he is 23
True
True
True
True
True
True
True
=666is =666is =666is =
1+2+3
alex
ALEX
Alex
-------
1l5x li
aLex li
7
['al', 'ex', 'dd', 'li', 'l', 'ss']
['1', '2', '3', '4']
aLEX lI

Process finished with exit code 0
View Code

 五、字典

字典是无序的,通过key:value键值对的方式存取

先写一个字典,对字典的基础操作。

info = {
    'student01':"TengLan Wu",
    'student02':"LongZe Luola",
    'student03':"XiaoZe Maliya"
}
#打印全部字典
print(info)
#通过key值,获取value
print(info["student01"])
#修改字典
info["student01"]="武藤兰"
#增加字典
info["student04"]="ChangJingkong"
del info["student01"]
print(info)
#输出结果:{'student03': 'XiaoZe Maliya', 'student02': 'LongZe Luola'}
info.pop("student02")
#输出结果:{'student03': 'XiaoZe Maliya'}
print(info)
#随机删除一个
info.popitem()
print(info)
#输出结果:{}
info = {
    'student01':"TengLan Wu",
    'student02':"LongZe Luola",
    'student03':"XiaoZe Maliya"
}
#查找:
# 确定有key值
print(info["student01"])
#输出:TengLan Wu
#不确定是否有key值,没有返回None
print(info.get('student02122'))
#输出:LongZe Luola
#判断是否存在key.返回布尔值
print('student01' in info)
#输出:True

利用eval将字符串转换为字典

#转换为字典
a="{'name' : 'jim', 'sex' : 'male', 'age': 18}"    #注意此处是字符串形式
b=eval(a)
print(b)
#输出结果:{'age': 18, 'sex': 'male', 'name': 'jim'}

字典的多级嵌套,其中可以嵌套:字典,字符,数字,列表,元组

范例:

av_catalog = {
    "欧美":{
        "www.youporn.com": ["很多免费的,世界最大的","质量一般"],
        "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"],
        "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"],
        "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"]
    },
    "日韩":{
        "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"]
    },
    "大陆":{
        "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"]
    }
}
View Code
#字典多级嵌套修改值,key尽量不要用中文
av_catalog["大陆"]["1024"][1]="可以在国内做个镜像"
#print(av_catalog)
#打印字典里的key值
print(av_catalog.keys())
#输出:dict_keys(['日韩', '大陆', '欧美'])
#添加一个字典。
av_catalog.setdefault("台湾",{"www.baidu.com":[1,2,3,4]})
print(av_catalog)
#如果key存在,就不添加,返回他的值
av_catalog.setdefault("大陆",{"www.baidu.com":[1,2,3,4]})
print(av_catalog)

两个字典合并:

info = {
    'student01':"TengLan Wu",
    'student02':"LongZe Luola",
    'student03':"XiaoZe Maliya"
}

b={
    'student01':'Alex',
    1:3,
    3:4
}
#合并info和b两个字典,有重复的key,进行赋值。没有重复的,进行添加(info.update)
info.update(b)
print(info)
#输出:{3: 4, 1: 3, 'student03': 'XiaoZe Maliya', 'student02': 'LongZe Luola', 'student01': 'Alex'}
#将一个字典转换成一个列表(info.items)
print(info.items())
#输出:dict_items([(1, 3), (3, 4), ('student03', 'XiaoZe Maliya'), ('student01', 'Alex'), ('student02', 'LongZe Luola')])

初始化一个字典:

#初始化一个字典,key为列表中的值,value为"tt"。只适用于定义第一层的值,不使用与套字典
b=dict.fromkeys([1,2,3,4],'tt')
print(b)
#输出{1: 'tt', 2: 'tt', 3: 'tt', 4: 'tt'}
#此处的1,2,3,4为key值,由于列表存在了内存中,修改值得时候,修改的同一块内存,类似于log中的问题。
c=dict.fromkeys([1,2,3,4],['name',{'tt':"sss"}])
print(c)
#输出:{1: ['name', {'tt': 'sss'}], 2: ['name', {'tt': 'sss'}], 3: ['name', {'tt': 'sss'}], 4: ['name', {'tt': 'sss'}]}
#这里请注意观察,下面只是进行修改了一个 key值对应的value。所有key对应的value都发生了改变
#原因,这里所有列表的内存地址,指向的是同一块内存地址,所以发生改变就会全部发生变化
c[2][1]["tt"]="alex"
print(c)
#输出:{1: ['name', {'tt': 'alex'}], 2: ['name', {'tt': 'alex'}], 3: ['name', {'tt': 'alex'}], 4: ['name', {'tt': 'alex'}]}

循环查询字典的方法:

#for循环查看字典
info = {
    'student01':"TengLan Wu",
    'student02':"LongZe Luola",
    'student03':"XiaoZe Maliya"
}
#推荐使用,基本循环查看字典
for i in info:
    print(i,info[i])
#这个会有一个把字典转成列表(items)。不高效,推荐上面的操作
for k,v in info.items():
    print(k,v)

 六、文件操作

#liuhao
#打开文件指定字符编码集,encoding="utf-8"
#data=open("test",encoding="utf-8").read()
#将文件的内存对象保存给f   #(文件句柄)

#读文件(默认open就是读模式)
#f=open("test",'r',encoding="utf-8")
#data=f.read()
#print(data)
'''
#  w 写文件(以写打开文件,创建一个文件。)
f=open("test2",'w',encoding="utf-8")
f.write("我爱北京天安门,\n")
f.write("天安门上太阳升\n")
f.close()


#  a=append追加,(可以追加的写内容,不能读文件)
f=open("test2",'a',encoding="utf-8")
f.write("我爱北京天安门,\n")
f.write("天安门上太阳升\n")
f.close()
'''
f=open("test","r",encoding="utf-8")
#for i in range(5):
#    print(f.readline())
#print(f.readlines())
'''
#readlines()打印全部。
for line in f.readlines():
    print(line)
 '''
#readlines()只适合读小文件,大文件会把内存读死
'''for index,line in enumerate(f.readlines()):
    if index==9:
        print("-----我是分隔符-----------")
        continue
    print(line.strip())
'''
#高逼格,一行行读,不占用内存。边读边覆盖
#高效率,只用这种方法。f 变成了迭代器了。
'''for line in f:
    print(line)
'''
#f.tell()查看当前光标读取位置,seek()修改光标读取位置
'''
print(f.tell())
print(f.readline())
print(f.tell())
print(f.readline())
print(f.tell())
f.seek(10)
print(f.readline())

#打印文件的编码
print(f.encoding)

#返回内存编号
print(f.fileno())
'''
'''
#刷新,写文件时候,缓存达到一定的量,写入硬盘
print(f.flush())
#实时刷新,没执行完写操作,执行f.flush()
'''

#b=open("test2",'a',encoding='utf-8')
#截断,
#b.truncate(20)
#打开test2文件,发现只剩下从开头到20个字符的内容
'''
#读写模式,用于读取已经存在的文件,在文件末尾追加内容。
file=open("test2",'r+',encoding='utf-8')
print(file.readline())
print(file.readline())
print(file.tell())
file.write("\n---------------diao------------")
print(file.readline())
'''
'''
#a+模式,追加读file2=open("test2",'a+',encoding='utf-8')
#写读模式,用于创建文件,同时进行写入操作。没什么用。一般不用
file2=open("test2",'w+',encoding='utf-8')
file2.write("-------------1\n")
file2.write("-------------2\n")
file2.write("-------------3\n")
file2.write("-------------4\n")
#此处移动光标位置,在10 的位置进行写入操作。
file2.seek(10)
print(file2.tell())
file2.write("dialdiao")
'''

#二进制文件读,二进制模式没有编码格式。不指定'encoding'
#file2=open("test2",'rb')
#以二进制文件模式打开写入文本模式
file2 = open("test2",'wb')
#写入内容,指定编码方式encode默认系统编码。encode转换为二进制
file2.write("hellow binary\n".encode())
file2.close()
#"U"表示在读取时,可以将\r\n \r\n自动转换成\n(与r或r+模式同时使用)
#rU     r+U
View Code

推荐用法:

#程序会帮你自动关闭文件。
with open("test2.bak",'r',encoding='utf-8') as file :
    for i in file:
        print(i)
#python规范,一行不超过80个字符,建议换行
with open("test2.bak",'r',encoding='utf-8') as f1,\
        open("test2",'r',encoding='utf-8') as f2:
    for i in f1:
        print(i)
    for i in f2:
        print(i)

 

小知识:

打印进度条

#进度条
import sys,time
for i in range(20):
    sys.stdout.write("#")
    sys.stdout.flush()
    time.sleep(0.5)

七、集合

基本操作

#liuhao
#无序的
#添加
list_1=set([1,2,3,4,9])
list_1.add(999)
list_1.update([888,777,555])
print(list_1)
#删除,元素不存在会报错
list_1.remove(9)
#删除,元素存不存在都不会返回值
print(list_1.difference(888))
print(list_1)
#随机删除
print(list_1.pop())
print(list_1.pop())
print(list_1.pop())
#集合的长度
print(len(list_1))
#判断在不在集合里
a=1 in list_1
print(a)

交集、并集、差集、子集、父集、对等差集

#liuhao

list_1=[1,2,3,4,5,5,5,6,2,1]
list_1=set(list_1)
#打印集合,集合是无序且不重复的
print(list_1)
list_2=set([2,4,66,5,66,22])
print(list_1,list_2)
#交集
print(list_1.intersection(list_2))
#并集
print(list_1.union(list_2))
#差集list_1中,list_2中没有的。
print(list_1.difference(list_2))
print(list_2.difference(list_1))
#子集,list_3是list1的自己
list_3=set( [2,4])
print(list_3.issubset(list_1))
#父集,list_1是list_3的父集
print(list_1.issuperset(list_3))

#对称差集,两个中相互没有的
print(list_1.symmetric_difference(list_2))
print("-------------------------")
list_4=set([1,3])
#没有交集
print(list_3.isdisjoint(list_4))

list_1=set([1,2,3])
list_2=set([2,3,4])
#交集
print(list_1&list_2)
#并集
print(list_2|list_1)
#差集
print(list_2-list_1)
print(list_1-list_2)
#对称差集
print(list_1 ^list_2)

 

posted @ 2017-01-17 20:40  saynobody  阅读(324)  评论(0编辑  收藏  举报