python基础二
一、用户与程序交互
#在python3中 input:用户输入任何值,都存成字符串类型 #在python2中 input:用户输入什么类型,就存成什么类型 raw_input:等于python3的input
二、基本数据类型
什么是数据?为何要有多种类型的数据?
#数据即变量的值,如age=18,18则是我们保存的数据。 #变量的是用来反映/保持状态以及状态变化的,毫无疑问针对不同的状态就应该用不同类型的数据去标识
概括地说,编程语言的划分方式有以下三种 1、编译型or解释型 2、强类型or弱类型 2.1 强类型语言: 数据类型不可以被忽略的语言 即变量的数据类型一旦被定义,那就不会再改变,除非进行强转。 在python中,例如:name = 'egon',这个变量name在被赋值的那一刻,数据类型就被确定死了,是字符型,值为'egon'。 2.2 弱类型语言:数据类型可以被忽略的语言 比如linux中的shell中定义一个变量,是随着调用方式的不同,数据类型可随意切换的那种。 3、动态型or静态型 3.1 动态语言 :运行时才进行数据类型检查 即在变量赋值时,就确定了变量的数据类型,不用事先给变量指定数据类型 3.2 静态语言:需要事先给变量进行数据类型定义 所以综上所述,Python是一门解释型的强类型动态语言
数字
#int整型 定义:age=10 #age=int(10) 用于标识:年龄,等级,身份证号,qq号,个数 #float浮点型 定义:salary=3.1 #salary=float(3.1) 用于标识:工资,身高,体重,
#int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483647 在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1,即-9223372036854775808~9223372036854775807 #long(长整型) 跟C语言不同,Python的长整数没有指定位宽,即:Python没有限制长整数数值的大小,但实际上由于机器内存有限,我们使用的长整数数值不可能无限大。 注意,自从Python2.2起,如果整数发生溢出,Python会自动将整数数据转换为长整数,所以如今在长整数数据后面不加字母L也不会导致严重后果了。 注意:在Python3里不再有long类型了,全都是int >>> a= 2**64 >>> type(a) #type()是查看数据类型的方法 <type 'long'> >>> b = 2**60 >>> type(b) <type 'int'> #complex复数型 >>> x=1-2j >>> x.imag -2.0 >>> x.real 1.0
字符串
#在python中,加了引号的字符就是字符串类型,python并没有字符类型。 定义:name='egon' #name=str('egon') 用于标识:描述性的内容,如姓名,性别,国籍,种族
#那单引号、双引号、多引号有什么区别呢? 让我大声告诉你,单双引号木有任何区别,只有下面这种情况 你需要考虑单双的配合 msg = "My name is Egon , I'm 18 years old!" #多引号什么作用呢?作用就是多行字符串必须用多引号 msg = ''' 今天我想写首小诗, 歌颂我的同桌, 你看他那乌黑的短发, 好像一只炸毛鸡。 ''' print(msg)
#数字可以进行加减乘除等运算,字符串呢?让我大声告诉你,也能?what ?是的,但只能进行"相加"和"相乘"运算。 >>> name='egon' >>> age='18' >>> name+age #相加其实就是简单拼接 'egon18' >>> name*5 'egonegonegonegonegon' #注意1:字符串相加的效率不高 字符串1+字符串3,并不会在字符串1的基础上加字符串2,而是申请一个全新的内存空间存入字符串1和字符串3,相当字符串1与字符串3的空间被复制了一次, #注意2:只能字符串加字符串,不能字符串加其他类型
列表
#在[]内用逗号分隔,可以存放n个任意类型的值 定义:students=['egon','alex','wupeiqi',] #students=list(['egon','alex','wupeiqi',]) 用于标识:存储多个值的情况,比如一个人有多个爱好
#存放多个学生的信息:姓名,年龄,爱好 >>> students_info=[['egon',18,['play',]],['alex',18,['play','sleep']]] >>> students_info[0][2][0] #取出第一个学生的第一个爱好 'play'
字典
#为何还要用字典? 存放一个人的信息:姓名,性别,年龄,很明显是多个值,既然是存多个值,我们完全可以基于刚刚学习的列表去存放,如下 >>> info=['egon','male',18] 定义列表的目的不单单是为了存,还要考虑取值,如果我想取出这个人的年龄,可以用 >>> info[2] 18 但这是基于我们已经知道在第3个位置存放的是年龄的前提下,我们才知道索引2对应的是年龄 即: #name, sex, age info=['egon','male',18] 而这完全只是一种假设,并没有真正意义上规定第三个位置存放的是年龄,于是我们需要寻求一种,即可以存放多个任意类型的值,又可以硬性规定值的映射关系的类型,比如key=value,这就用到了字典
#在{}内用逗号分隔,可以存放多个key:value的值,value可以是任意类型 定义:info={'name':'egon','age':18,'sex':18} #info=dict({'name':'egon','age':18,'sex':18}) 用于标识:存储多个值的情况,每个值都有唯一一个对应的key,可以更为方便高效地取值
info={ 'name':'egon', 'hobbies':['play','sleep'], 'company_info':{ 'name':'Oldboy', 'type':'education', 'emp_num':40, } } print(info['company_info']['name']) #取公司名 students=[ {'name':'alex','age':38,'hobbies':['play','sleep']}, {'name':'egon','age':18,'hobbies':['read','sleep']}, {'name':'wupeiqi','age':58,'hobbies':['music','read','sleep']}, ] print(students[1]['hobbies'][1]) #取第二个学生的第二个爱好
布尔
#布尔值,一个True一个False #计算机俗称电脑,即我们编写程序让计算机运行时,应该是让计算机无限接近人脑,或者说人脑能干什么,计算机就应该能干什么,人脑的主要作用是数据运行与逻辑运算,此处的布尔类型就模拟人的逻辑运行,即判断一个条件成立时,用True标识,不成立则用False标识 >>> a=3 >>> b=5 >>> >>> a > b #不成立就是False,即假 False >>> >>> a < b #成立就是True, 即真 True 接下来就可以根据条件结果来干不同的事情了: if a > b print(a is bigger than b ) else print(a is smaller than b ) 上面是伪代码,但意味着, 计算机已经可以像人脑一样根据判断结果不同,来执行不同的动作。
布尔类型的重点知识!!!:
#所有数据类型都自带布尔值 1、None,0,空(空字符串,空列表,空字典等)三种情况下布尔值为False 2、其余均为真
重点:
#1.可变类型:在id不变的情况下,value可以变,则称为可变类型,如列表,字典 #2.不可变类型:value一旦改变,id也改变,则称为不可变类型(id变,意味着创建了新的内存空间)
三、格式化输出
程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式
比如要求用户输入用户名和年龄,然后打印如下格式:
My name is xxx,my age is xxx.
很明显,用逗号进行字符串拼接,只能把用户输入的名字和年龄放到末尾,无法放到指定的xxx位置,而且数字也必须经过str(数字)的转换才能与字符串进行拼接。
这就用到了占位符,如:%s、%d
#%s字符串占位符:可以接收字符串,也可接收数字 print('My name is %s,my age is %s' %('egon',18)) #%d数字占位符:只能接收数字 print('My name is %s,my age is %d' %('egon',18)) print('My name is %s,my age is %d' %('egon','18')) #报错 #接收用户输入,打印成指定格式 name=input('your name: ') age=input('your age: ') #用户输入18,会存成字符串18,无法传给%d print('My name is %s,my age is %s' %(name,age)) #注意: #print('My name is %s,my age is %d' %(name,age)) #age为字符串类型,无法传给%d,所以会报错
练习:用户输入姓名、年龄、工作、爱好 ,然后打印成以下格式 ------------ info of Egon ----------- Name : Egon Age : 22 Sex : male Job : Teacher ------------- end -----------------
# 方法一
name = input('请输入名字:')
age = input('请输入年龄:')
sex = input('请输入性别:')
job = input('请输入你的工作:')
s = '''
------ info of {name}------
Name:{name}
Age:{age}
Sex:{sex}
Job:{job}
------ end ------
'''.format(name=name, age=age, sex=sex, job=job)
print(s)
# 方法二
name = input()
age = input()
sex = input()
job = input()
s = '''
------ info of {0}------
Name:{0}
Age:{1}
Sex:{2}
Job:{3}
------ end ------
'''.format(name, age, sex, job)
print(s)
四、基本运算符
计算机可以进行的运算有很多种,可不只加减乘除这么简单,运算按种类可分为算数运算、比较运算、逻辑运算、赋值运算、成员运算、身份运算、位运算,今天我们暂只学习算数运算、比较运算、逻辑运算、赋值运算
赋值运算符
# python语法中除了有 = 号这种简单的赋值运算外,还支持增量赋值、链式赋值、交叉赋值、解压赋值, # 这些赋值运算符存在的意义都是为了让我们的代码看起来更加精简。 # (1)增量赋值+=,-=,/=,*=,//=,%=,**= # 1、链式赋值 ''' 如果我们想把同一个值同时赋值给多个变量名,可以这么做 >>> x=y=z=10 >>> x,y,z (10, 10, 10) ''' # 2、交叉赋值 ''' 我们定义两个变量m与n>>> m=10 >>> n=20如果我们想将m与n的值交换过来,可以这么做>>> temp=m >>> m=n >>> n=temp >>> m,n (20, 10)交叉赋值指的是一行代码可以搞定这件事>>> m=10 >>> n=20 >>> m,n=n,m # 交叉赋值 >>> m,n (20, 10) ''' # 3、解压赋值 ''' >>> nums=[11,22,33,44,55] >>> >>> a=nums[0] >>> b=nums[1] >>> c=nums[2] >>> d=nums[3] >>> e=nums[4] >>> a,b,c,d,e (11, 22, 33, 44, 55) # 解压赋值指的是一行代码可以搞定这件事>>> a,b,c,d,e=nums # nums包含多个值,就好比一个压缩包,解压赋值因此得名 但如果我们只想取头尾的几个值,可以用*_匹配,取两头,字典是去key值 >>> a,b,*_=nums >>> a,b (11, 22) ps:字符串、字典、元组、集合类型都支持解压赋值
算数运算
以下假设变量:a=10,b=20
print(4/3) #保留小数 print(2355//3) #只保留整数部分 print(2355%3) #取模,取余数 print(4**3) #去多少次方
比较运算
以下假设变量:a=10,b=20
逻辑运算
#1、三者的优先级关系:not>and>or,同一优先级默认从左往右计算。 >>> 3>4 and 4>3 or 1==3 and 'x' == 'x' or 3 >3 False #2、最好使用括号来区别优先级,其实意义与上面的一样 ''' 原理为: (1) not的优先级最高,就是把紧跟其后的那个条件结果取反,所以not与紧跟其后的条件不可分割 (2) 如果语句中全部是用and连接,或者全部用or连接,那么按照从左到右的顺序依次计算即可 (3) 如果语句中既有and也有or,那么先用括号把and的左右两个条件给括起来,然后再进行运算 ''' >>> (3>4 and 4>3) or (1==3 and 'x' == 'x') or 3 >3 False #3、短路运算:逻辑运算的结果一旦可以确定,那么就以当前处计算到的值作为最终结果返回 >>> 10 and 0 or '' and 0 or 'abc' or 'egon' == 'dsb' and 333 or 10 > 4 我们用括号来明确一下优先级 >>> (10 and 0) or ('' and 0) or 'abc' or ('egon' == 'dsb' and 333) or 10 > 4 短路: 0 '' 'abc' 假 假 真 返回: 'abc' #4、短路运算面试题: >>> 1 or 3 1 >>> 1 and 3 3 >>> 0 and 2 and 1 0 >>> 0 and 2 or 1 1 >>> 0 and 2 or 1 or 4 1 >>> 0 or False and 1 False
成员运算符
# in ; # print("l" in "liuqiao") # 判断列表、判断字典时,是判断key. # not in;
身份运算
#is比较的是id
#而==比较的是值
五、流程控制之if...else
既然我们编程的目的是为了控制计算机能够像人脑一样工作,那么人脑能做什么,就需要程序中有相应的机制去模拟。人脑无非是数学运算和逻辑运算,对于数学运算在上一节我们已经说过了。对于逻辑运算,即人根据外部条件的变化而做出不同的反映,比如
1 如果:女人的年龄>30岁,那么:叫阿姨
age_of_girl=31 if age_of_girl > 30: print('阿姨好')
2 如果:女人的年龄>30岁,那么:叫阿姨,否则:叫小姐
age_of_girl=18 if age_of_girl > 30: print('阿姨好') else: print('小姐好')
3 如果:女人的年龄>=18并且<22岁并且身高>170并且体重<100并且是漂亮的,那么:表白,否则:叫阿姨
age_of_girl = 18 height = 171 weight = 99 is_pretty = True if age_of_girl >= 18 and age_of_girl < 22 and height > 170 and weight < 100 and is_pretty == True: print('表白...') else: print('阿姨好')
#在表白的基础上继续: #如果表白成功,那么:在一起 #否则:打印。。。 age_of_girl=18 height=171 weight=99 is_pretty=True success=False if age_of_girl >= 18 and age_of_girl < 22 and height > 170 and weight < 100 and is_pretty == True: if success: print('表白成功,在一起') else: print('什么爱情不爱情的,爱nmlgb的爱情,爱nmlg啊...') else: print('阿姨好')
4 如果:成绩>=90,那么:优秀
如果成绩>=80且<90,那么:良好
如果成绩>=70且<80,那么:普通
其他情况:很差
score = input('请输入分数:') score = int(score) if score >= 90: print('优秀') elif score >= 80 and score < 90: print('良好') elif score >=70 and score <80: print('普通') else: print('很差')
if 条件1: 缩进的代码块 elif 条件2: 缩进的代码块 elif 条件3: 缩进的代码块 ...... else: 缩进的代码块
练习一:
''' egon --> 超级管理员 tom --> 普通管理员 jack,rain --> 业务主管 其他 --> 普通用户 ''' name = input('请输入姓名:') if name == 'egon': print('超级管理员') elif name == 'tom': print('普通管理员') elif name == 'jack' or name == 'rain': print('业务主管') else: print('普通用户')
练习二:
today = input('请输入星期几:') if today in ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', ]: print('上班') elif today in ['Saturday', 'Sunday',]: print('出去浪') else: print('请输入正确星期几')
六、流程控制之while循环
1、 条件循环:while,语法如下
while 条件: # 循环体 # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件。。。 # 如果条件为假,那么循环体不执行,循环终止
# 打印0-10 count=0 while count <= 10: print('loop',count) count+=1 # 打印0-10之间的偶数 count = 0 while count <= 10: if count % 2 == 0: print(count) count += 1 # 打印0-10之间的奇数 count = 0 while count <= 10: if count % 2 == 1: print(count) count += 1
2、死循环
import time num = 0 while True: print('count', num) time.sleep(1) num += 1
3、循环嵌套与tag
tag=True while tag: ...... while tag: ........ while tag: tag=False
#练习,要求如下: 1 循环验证用户输入的用户名与密码 2 认证通过后,运行用户重复执行命令 3 当用户输入命令为quit时,则退出整个程序
ag = True while tag: name = input('请输入用户名:') password = input('请输入密码:') if name == 'lq' and password == '123': while tag: cmd = input('请输入命令:') if not cmd: continue if cmd == 'quit': tag = False continue print('请执行该命令{}'.format(cmd)) else: print('用户名或密码错误')
4、 break与continue
#break用于退出本层循环 while True: print("123") break print("456") #continue用于退出本次循环,继续下一次循环 while True: print("123") continue print("456")
5、while+else
#与其它语言else 一般只与if 搭配不同,在Python 中还有个while ...else 语句,while 后面的else 作用是指,当while 循环正常执行完,中间没有被break 中止的话,就会执行else后面的语句 count = 0 while count <= 5 : count += 1 print("Loop",count) else: print("循环正常执行完啦") print("-----out of while loop ------") 输出 Loop 1 Loop 2 Loop 3 Loop 4 Loop 5 Loop 6 循环正常执行完啦 -----out of while loop ------ #如果执行过程中被break啦,就不会执行else的语句啦 count = 0 while count <= 5 : count += 1 if count == 3:break print("Loop",count) else: print("循环正常执行完啦") print("-----out of while loop ------") 输出 Loop 1 Loop 2 -----out of while loop ------
6、while循环练习题
# 1. 使用while循环输出1 2 3 4 5 6 8 9 10 count = 1 while count <= 10: if count == 7: count+=1 continue print(count) count += 1 # 2. 求1-100的所有数的和 res = 0 count = 1 while count <= 100: res += count count += 1 print(res) # 3. 输出 1-100 内的所有奇数 count = 1 while count <= 100: if count % 2 == 1: print(count) count += 1 # 4. 输出 1-100 内的所有偶数 count = 1 while count <= 100: if count % 2 == 0: print(count) count += 1 # 5. 求1-2+3-4+5 ... 99的所有数的和 res1 = 0 res2 = 0 count = 1 while count < 100: if count % 2 == 0: res1 -= count if count % 2 == 1: res2 += count count += 1 print(res1 + res2) # 6. 用户登陆(三次机会重试) count = 0 while count < 3: name = input('请输入用户名:') password = input('请输入登录密码:') if name == 'lq' and password == '123': print('登录成功') break else: count += 1 print('用户名或密码错误') else: print('三次机会用完,请等60秒后登录') # 7:猜年龄游戏 # 要求: # 允许用户最多尝试3次,3次都没猜对的话,就直接退出,如果猜对了,打印恭喜信息并退出 age=35 count=0 while count<3: guess_age=int(input('输入年龄')) if guess_age==35: print('guess success') break else: count+=1 # 8:猜年龄游戏升级版 # 要求: # 允许用户最多尝试3次 # 每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y或y, 就继续让其猜3次,以此往复,如果回答N或n,就退出程序 # 如何猜对了,就直接退出 age = 35 count = 0 while count < 3: guess_age = int(input('输入年龄')) if guess_age == 35: print('guess success') break else: count += 1 if count == 3: answer = input('是否想继续') if answer == 'Y' or answer == 'y': count = 0 else: break
七、流程控制之for循环
迭代式循环:for,语法如下
for i in range(10):
缩进的代码块
2 break与continue(同上)
3 循环嵌套
九九乘法表
for i in range(1, 10): for j in range(1, i + 1): print('{}*{}={}'.format(i, j, i * j), end=' ') print() # 默认换行
# 打印金字塔 #分析 ''' #max_level=5 * #current_level=1,空格数=4,*号数=1 *** #current_level=2,空格数=3,*号数=3 ***** #current_level=3,空格数=2,*号数=5 ******* #current_level=4,空格数=1,*号数=7 ********* #current_level=5,空格数=0,*号数=9 #数学表达式 空格数=max_level-current_level *号数=2*current_level-1 ''' #实现 max_level=5 for current_level in range(1,max_level+1): for i in range(max_level-current_level): print(' ',end='') #在一行中连续打印多个空格 for j in range(2*current_level-1): print('*',end='') #在一行中连续打印多个空格 print()
八、开发工具IDE
1 为何要用IDE
到现在为止,我们也是写过代码的人啦,但你有没有发现,每次写代码要新建文件、写完保存时还要选择存放地点,执行时还要切换到命令行调用python解释器,好麻烦呀,能否一气呵成,让我简单的写代码?此时开发工具IDE上场啦,一个好的IDE能帮你大大提升开发效率。
很多语言都有比较流行的开发工具,比如JAVA 的Eclipse, C#,C++的VisualStudio, Python的是啥呢? Pycharm,最好的Python 开发IDE
2 安装
下载地址:https://www.jetbrains.com/pycharm/download 选择Professional 专业版
Comunnity社区版是免费的,但支持的功能不多,比如以后我们会学的Django就不支持,所以还是用专业版,但专业版是收费的,一年一千多,不便宜。唉,万能的淘宝。。。不宜再多说啦。
注册完成后启动,会让你先创建一个项目,其实就是一个文件夹,我们以后的代码都存在这里面
3 创建目录
你以后写的项目可能有成百上千个代码文件 ,全放在一起可不好,所以一般把同样功能的代码放在一个目录,我们现在以天为单位,为每天的学习创建一个目录day1,day2,day3...这样
九、作业
1 练习题
*简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释型
C、C++编译型 python解释型
*执行 Python 脚本的两种方式是什么
- 交互运行方式和 Windows 系统上的 cmd 类似,启动 Python 解释器后,解释器等待用户输入指令,在接收到用户指令后就去执行该指令,指令执行完毕后接着等待用户的下一条指令。
- 而脚本运行方式则是将用户执行存入到一个文本文件中,然后让解释器去执行该文本文件中的所有指令。
* Pyhton 单行注释和多行注释分别用什么?
# 单行
'''
''' 多行注释
布尔值分别有什么?
False True
声明变量注意事项有那些?
- 变量 和 数据 是分开存储的
- 数据 保存在内存中的一个位置
- 变量 中保存着数据在内存中的地址
- 变量 中 记录数据的地址,就叫做 引用
如何查看变量在内存中的地址?
- 使用
id()
函数可以查看变量中保存数据所在的 内存地址
写代码
实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败!
实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败,失败时允许重复输入三次
实现用户输入用户名和密码,当用户名为 seven 或 alex 且 密码为 123 时,显示登陆成功,否则登陆失败,失败时允许重复输入三次
count = 0
while count < 3:
name = input('请输入用户名:')
password = int(input('请输入密码:'))
if name == 'seven' or name == 'alex' and password == 123:
print('登录成功')
break
else:
print('登录失败')
count += 1
else:
print('给你三次机会了,请关机')
写代码
a. 使用while循环实现输出2-3+4-5+6...+100 的和
count = 2
sec1 = 0
sec2 = 0
while count <= 100:
if count % 2 == 0:
sec1 += count
else:
sec2 -= count
count += 1
print(sec1+sec2)
b. 使用 while 循环实现输出 1,2,3,4,5, 7,8,9, 11,12
count = 1
while count <= 12:
if count == 10:
count += 1
continue
print(count)
count += 1
c. 使用 while 循环实现输出 1-100 内的所有奇数
count = 1
while count <= 100:
if count % 2 == 1:
print(count)
count += 1
d. 使用 while 循环实现输出 1-100 内的所有偶数
count = 1
while count <= 100:
if count % 2 == 0:
print(count)
count += 1
现有如下两个变量,请简述 n1 和 n2 是什么关系?
n1 = 123456 n2 = n1
value相等,内存地址不同
2 作业:编写登陆接口
基础需求:
- 让用户输入用户名密码
- 认证成功后显示欢迎信息
- 输错三次后退出程序
dic={ 'egon1':{'password':'123','count':0}, 'egon2':{'password':'123','count':0}, 'egon3':{'password':'123','count':0}, } while True: name=input('username>>: ') if not name in dic: print('用户不存在') continue if dic[name]['count'] > 2: print('尝试次数过多,锁定') continue password=input('password>>: ') if password == dic[name]['password']: print('登录成功') break else: print('用户名或密码错误') dic[name]['count']+=1
升级需求:
- 可以支持多个用户登录 (提示,通过列表存多个账户信息)
- 用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里)
#db.txt内容:egon1|egon2| dic={ 'egon1':{'password':'123','count':0}, 'egon2':{'password':'123','count':0}, 'egon3':{'password':'123','count':0}, } count=0 while True: name=input('u>>: ') if name not in dic: print('用户不存在') continue with open('db.txt','r') as f: lock_users=f.read().split('|') if name in lock_users: print('用户%s已经被锁定' %name) break if dic[name]['count'] > 2: print('尝试次数过多,锁定') with open('db.txt','a') as f: f.write('%s|' %name) break password=input('p>>: ') if password == dic[name]: print('登录成功') break else: print('用户名或密码错误') dic[name]['count']+=1