Python基本数据类型及程序与用户交互
数据类型
数据类型是用来记录事物状态的,而事物的状态是不断变化的(如:一个人年龄的增长(操作int类型) ,单个人名的修改(操作str类型),学生列表中增加学生(操作list类型)等),这意味着我们在开发程序时需要频繁对数据进行操作,为了提升我们的开发效率, Python针对这些常用的操作,为每一种数据类型内置了一系列方法。
本章的主题就是带大家详细了解下它们,以及每种数据类型的详细定义、类型转换。
数字类型之int与float
-
定义
# 1、定义: # 1.1 整型int的定义 age = 10 # 本质age = int(10) # 1.2 浮点型float的定义 salary = 3000.3 # 本质salary=float(3000.3) # 注意:名字+括号的意思就是调用某个功能,比如 # print(...)调用打印功能 # int(...)调用创建整型数据的功能 # float(...)调用创建浮点型数据的功能
-
类型转换
# 1、数据类型转换 # 1.1 int可以将由纯整数构成的字符串直接转换成整型,若包含其他任意非整数符号,则会报错 >>> s = '123' >>> res = int(s) >>> res,type(res) (123, <class 'int'>) >>> int('12.3') # 错误演示:字符串内包含了非整数符号. Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: '12.3' # 1.2 进制转换 # 十进制转其他进制 >>> bin(3) # 转化为二进制 '0b11' >>> oct(9) # 转化为八进制 '0o11' >>> hex(17) # 转化为十六进制 '0x11' # 其他进制转十进制 >>> int('0b11',2) 3 >>> int('0o11',8) 9 >>> int('0x11',16) 17 # 1.3 float同样可以用来做数据类型的转换 >>> s = '12.3' >>> res = float(s) >>> res,type(res) (12.3, <class 'float'>)
-
使用
-
数学运算
>>> a = 1 >>> b = 3 >>> c = a + b >>> c 4
-
比较大小
>>> x = 10 >>> y = 11 >>> x > y False
数值类型主要就是用来做数学运算与比较运算,因此数字类型除了运算符结合使用之外,并无需要掌握的内置方法。
-
数据类型之字符串str
-
定义
# 定义:在单引号\双引号\三引号内包含一串字符 # 作用:主要用于记录描述性性质的数据,eg:姓名 地址 邮箱 name1 = 'jason' # 本质:name = str('任意形式内容') name2 = "lili" # 本质:name = str("任意形式内容") name3 = '''tony''' # 本质:name = str("""任意形式内容""") name4 = """ricky""" # 本质:name = str("""任意形式内容""")
用单引号、双引号、多引号,都可以定义字符串,本质上是没有区别的,但是
#1、需要考虑引号嵌套的配对问题 msg = "My name is Tony , I'm 18 years old!" #内层有单引号,外层就需要用双引号 #2、多引号可以写多行字符串 msg = ''' 天下只有两种人。比如一串葡萄到手,一种人挑最好的先吃,另一种人把最好的留到最后吃。 照例第一种人应该乐观,因为他每吃一颗都是吃剩的葡萄里最好的;第二种人应该悲观,因为他每吃一颗都是吃剩的葡萄里最坏的。 不过事实却适得其反,缘故是第二种人还有希望,第一种人只有回忆。 '''
-
使用
数字可以进行加减乘除等运算,字符串呢?也可以,但只能进行"相加"和"相乘"运算。>>> name = 'tony' >>> age = '18' >>> name + age # 相加其实就是简单的字符串拼接 'tony18' >>> name * 5 # 相乘就相当于将字符串相加了5次 'tonytonytonytonytony'
数据类型之列表list
-
作用
如果我们需要用一个变量记录多个学生的姓名,用数字类型是无法实现,字符串类型确实可以记录下来,比如
stu_names='张三 李四 王五',但存的目的是为了取,此时若想取出第二个学生的姓名实现起来相当麻烦,而列表类型就是专门用来记录多个同种属性的值(比如同一个班级多个学生的姓名、同一个人的多个爱好等),并且存取都十分方便。
-
定义
# 定义:在[]内,用逗号分隔开多个任意数据类型的值 l1 = [1,'a',[1,2]] # 本质:l1 = list([1,'a',[1,2]])
-
使用
# 1、列表类型是用索引来对应值,索引代表的是数据的位置,从0开始计数 >>> stu_names = ['张三','李四','王五'] >>> stu_names[0] '张三' >>> stu_names[1] '李四' >>> stu_names[2] '王五' # 2、列表可以嵌套,嵌套取值如下 >>> students_info = [['tony',18,['jack',]],['jason',18,['play','sleep']]] >>> students_info[0][2][0] # 取出第一个学生的第一个爱好 'jack'
数据类型之字典dict
-
作用
如果我们需要用一个变量记录多个值,但多个值是不同属性的,比如人的姓名、年龄、身高,用列表可以存,但列表是用索引对应值的,而索引不能明确地表示值的含义,这就用到字典类型,字典类型是用key:value的形式来存储数据,其中key可以对value有描述性的功能
-
定义
# 定义:在{}内用逗号分隔开多元素,每一个元素都是key:value的形式,其中value可以是任意类型,而key则必须是不可变类型,通常key应该是str类型,因为str类型会对value有描述性的功能 info = {'name': 'tony', 'age': 18, 'sex': 'male'} # 本质info = dict({....}) # 也可以这么定义字典 info = dict(name='tony',age=18,sex='male') # info = {'name': 'tony','age': 18, 'sex': 'male'}
-
使用
# 1、字典类型是用key来对应值,key可以对值有描述性的功能,通常为字符串类型 >>> person_info = {'name':'tony','age':18,'height':185.3} >>> person_info['name'] 'tony' >>> person_info['age'] 18 >>> person_info['height'] 185.3 # 2、字典可以嵌套,嵌套取值如下 >>> students=[ ... {'name':'tony','age':38,'hobbies':['play','sleep']}, ... {'name':'jack','age':18,'hobbies':['read','sleep']}, ... {'name':'rose','age':58,'hobbies':['music','read','sleep']}, ... ] >>> students[1]['hobbies'][1] # 取第二个学生的第二个爱好 'sleep' # 字典无法使用索引取值,需要借助于key。
数据类型之布尔值bool
-
作用
用于记录真假这两种状态。
-
定义
布尔值只有两种状态- True:对的 正确的 可行的
- False:错的 不可行的…
# 补充 # 针对布尔值的变量名一般采用is开头 is_right = True is_delete = False is_alive = True # 扩展 """ 现实生活中的数据存储与销户,其实很大概率上并没有删除数据,而是修改了数据的某个唯一标识 然后通过代码筛选过滤掉. """ # 记忆 """ 在python中所有的数据类型都可以转成布尔值 布尔值为False的有: 0,None,'',[],{}... 其他情况一律为True """
-
使用
通常用来当做判断的条件,会在后续的if判断中使用到它。
数据类型之元组tuple
-
作用
与列表几乎一致,内部可以存放多个元素(可以看成是不可变的列表)
-
定义
# 在()内用逗号分隔开多个任意类型的值,元素不支持修改 >>> countries = ("中国","美国","英国") # 本质:countries = tuple("中国","美国","英国") # 强调:如果元组内只有一个值,则必须加一个逗号,否则()就只是包含的意思而非定义元组 >>> countries = ("中国",) # 本质:countries = tuple("中国")
数据类型之集合set
-
作用
集合、list、tuple、dict一样都可以存放多个值,但是集合主要用于:去重,关系运算 -
定义
""" 定义:在{}内用逗号分隔开多个元素,集合具备以下三个特点: 1:每个元素必须是不可变类型 2:集合内没有重复的元素 3:集合内元素无序 """ s = {1,2,3,4} # 本质 s = set({1,2,3,4}) # 注意1:列表类型是索引对应值,字典是key对应值,均可以取得单个指定的值,而集合类型既没有索引也没有key与值对应,所以无法取得单个的值,而且对于集合来说,主要用于去重与关系元素,根本没有取出单个指定值这种需求。 # 注意2:{}既可以用于定义dict,也可以用于定义集合,但是字典内的元素必须是key:value的格式,现在我们想定义一个空字典和空集合,该如何准确去定义两者? d = {} # 默认是空字典 s = set() # 这才是定义空集合
程序与用户交互
-
什么是与用户交互
用户交互就是人往计算机中输入数据(input),计算机输出结果(print) -
为什么要与用户交互
为了让计算机能够像人一样与用户沟通交流。
比如,过去我们去银行取钱,用户需要把帐号密码告诉柜员,而现在,柜员被ATM机取代,ATM机就是一台计算机,所以用户同样需要将帐号密码告诉计算机,于是我们的程序中必须有相应的机制来控制计算机接收用户输入的内容,并且输出结果。
-
如何与用户交互
交互的本质就是输入、输出
-
输入input
# 在python3中input功能会等待用户的输入,用户输入任何内容,都存成字符串类型,然后赋值给等号左边的变量名 >>> username = input('请输入您的用户名:') 请输入您的用户名:jack # username = "jack" >>> password = input('请输入您的密码:') 请输入您的密码:123 # password = "123" # 了解知识: # 1、在python2中存在一个raw_input功能与python3中的input功能一模一样 # 2、在python2中还存在一个input功能,需要用户输入一个明确的数据类型,输入什么类型就存成什么类型 >>> L = input('输入什么类型就存成什么类型: ') 输入什么类型就存成什么类型: [1,2,3] >>> type(L) <type 'list'>
-
输出print
>>> print('hello world') # 只输出一个值 hello world >>> print('first','second','third') # 一次性输出多个值,值用逗号隔开 first second third # 默认print功能有一个end参数,该参数的默认值为"\n"(代表换行),可以将end参数的值改成任意其它字符 print("aaaa",end='') print("bbbb",end='&') print("cccc",end='@') # 整体输出结果为:aaaabbbb&cccc@
-
输出之格式化输出
-
什么是格式化输出?
把一段字符串里面的某些内容替换掉之后在输出,就是格式化输出。
-
为什么要格式化输出?
我们经常会输出具有某种固定格式的内容,比如:'亲爱的xxx你好!你xxx月的话费是xxx,余额是xxx‘,我们需要做的就是将xxx替换为具体的内容。
-
如何格式化输出?
# %s占位符:可以接收任意类型的值 # %d占位符:只能接收数字 >>> print('亲爱的%s你好!你%s月的话费是%d,余额是%d' % ('tony',12,103,11)) 亲爱的tony你好!你12月的话费是103,余额是11 # 练习1:接收用户输入,打印成指定格式 name = input('your name: ') age = input('your age: ') # 用户输入18,会存成字符串18,无法传给%d print('My name is %s,my age is %s' % (name,age)) # 练习2:用户输入姓名、年龄、工作、爱好 ,然后打印成以下格式 ------------ info of Tony ----------- Name : Tony Age : 22 Sex : male Job : Teacher -------------- end ------------------
-
-
基本运算符
-
算术运算符
python支持的算数运算符与数学上的符号使用是一致的,我们以x=9,y=2为例来一次介绍它们
-
比较运算符
比较运算用来对两个值进行比较,返回的是布尔值True或False,我们以x=9,y=2为例来依次介绍它们
-
赋值运算符
Python语法中除了有=号这种简单的赋值运算外,还支持增量赋值、链式赋值、交叉赋值、解压赋值,这些赋值运算符存在的意义都是为了让我们的代码看起来更加精简。我们以x=9,y=2为例先来介绍一下增量赋值
-
增量赋值
-
链式赋值
如果我们想把同一个值同时赋给多个变量名,可以这么做
>>> z = 10 >>> y = z >>> x = y >>> x,y,z (10, 10, 10)
链式赋值指的是可以用一行代码搞定这件事
>>> x = y = z = 10 >>> x,y,z (10, 10, 10)
-
交叉赋值
我们定义两个变量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)
-
解压赋值
如果我们想把列表中的多个值取出来依次赋值给多个变量名,可以这么做
>>> 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包含多个值,就好比一个压缩包,解压赋值因此得名 >>> a,b,c,d,e (11, 22, 33, 44, 55)
注意,上述解压赋值,等号左边的变量名个数必须与右面包含值的个数相同,否则会报错
#1、变量名少了 >>> a,b = nums Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: too many values to unpack (expected 2) #2、变量名多了 >>> a,b,c,d,e,f = nums Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: not enough values to unpack (expected 6, got 5)
但如果我们只想取头尾的几个值,可以用*_匹配
>>> a,b,*_ = nums >>> a,b (11, 22)
ps:字符串、字典、元组、集合类型都支持解压赋值
-
-
逻辑运算符
逻辑运算符用于连接多个条件,进行关联判断,会返回布尔值True或False
-
连续多个and
可以用and连接多个条件,会按照从左到右的顺序依次判断,一旦某一个条件为False,则无需再往右判断,可以立即判定最终结果就为False,只有在所有条件的结果都为True的情况下,最终结果才为True。
>>> 2 > 1 and 1 != 1 and True and 3 > 2 # 判断完第二个条件,就立即结束,得的最终结果为False False
-
连续多个or
可以用or连接多个条件,会按照从左到右的顺序依次判断,一旦某一个条件为True,则无需再往右判断,可以立即判定最终结果就为True,只有在所有条件的结果都为False的情况下,最终结果才为False
>>> 2 > 1 or 1 != 1 or True or 3 > 2 # 判断完第一个条件,就立即结束,得的最终结果为True True
-
优先级not>and>or
# 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 'jason' == 'dsb' and 333 or 10 > 4 我们用括号来明确一下优先级 >>> (10 and 0) or ('' and 0) or 'abc' or ('jason' == '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
-
-
成员运算符
注意:虽然下述两种判断可以达到相同的效果,但我们推荐使用第二种格式,因为not in语义更加明确
>>> not 'lili' in ['jack','tom','robin'] True >>> 'lili' not in ['jack','tom','robin'] # 推荐使用 True
-
身份运算符
需要强调的是:==双等号比较的是value是否相等,而is比较的是id是否相等
# 1. id相同,内存地址必定相同,意味着type和value必定相同 # 2. value相同type肯定相同,但id可能不同,如下 >>> x = 'Info Tony:18' >>> y = 'Info Tony:18' >>> id(x),id(y) # x与y的id不同,但是二者的值相同 (4327422640, 4327422256) >>> x == y # 等号比较的是value True >>> type(x),type(y) # 值相同type肯定相同 (<class 'str'>, <class 'str'>) >>> x is y # is比较的是id,x与y的值相等但id可以不同 False