人生苦短,我爱Python
接上篇:薛钦亮的python教程(一)从安装Anaconda开始
本文将简要介绍使用python所必须掌握的基本数据类型、各种运算符,适合初学者收藏,建议看博客的同时打开python的交互控制台(就是那个里面可以输入python语句的小黑框)或者jupyter notebook同步操作,收获会更大。
〇、python的输入输出
既然是编程语言教学,编号自然应该从〇开始(其实是这个部分后面发现应该先讲,不然学起来很影响体验)。
1. 输出
python的输出非常简单,不用指定类型,直接打印即可,举个栗子大家就懂了。
print("hello world")
print(100)
a = 2021.2021
print(a)
print(23,63,"Python") #还可以一次打印多个
总之,凡是python的基本类型,print都可以直接打印。
但python作为强大的编程语言,也可以指定类型,格式化符号基本同C语言,格式化字符串同变量之间用%连接。看个例子:
lan = "Python"
num = 3000
print("I love %s %d times"%(lan,num))
结果为:I love Python 3000 times
Python打印末尾默认加了一个换行符,如果打印多个变量分隔符默认为空格,如果要修改,可以用sep和end参数指定。
print(1,2,3,4,5,"python","打老虎",sep='%',end='$')
输出为:1%2%3%4%5%python%打老虎$
如果用Python2,可以使用print关键字来输出,可以不加括号(篇幅问题,不展开介绍)
2. 输入
Python3的输入只需要input()函数。这个函数接收任意任性输入,将所有输入默认为字符串处理,并返回字符串类型。
>>> a = input()
123
>>> a #可以看到a为字符串类型
'123'
>>> a = input("请输入:") #input内可以接受一个字符串作为输入的提示
请输入:ahhhhhh
>>> a
'ahhhhhh'
在Python2中,有input()和raw_input()两个函数,input()会根据输入自动识别类型,raw_input()相当于Python3的input()。
一、python基本数据类型及运算
Python只需要声明对象和变量名,不需要指定类型,类型是在内存中体现的,会根据数据的实际值来自动判断类型。大体上,类型可以分为以下几类:数值类型(int、float、bool、complex)、序列类型(string,list,tuple,set,dict)。其余所有的复杂类型和类都是基于这几种变量而生成的。
1. Number(数字)
python的Number不是单一类型,泛指一切数字,具体来讲,可以分为 int、float、bool、complex(复数)四种。
a = 10 #int类型,不多说明
b = 1.1 #float,此处不区分float和double,python的精度和机器有关
c = True #python中True和False是定义好的变量值,需要大写
d = 4+5j #python定义复数,复数符号应该用j而不是i,且只支持二维复数
由此引出常用的运算有:
1.1 算术运算
加法(+)、减法(-)、乘法(*)、除法(/)、整除(//)、幂指(**)、取余(%)。
特别需要说明的是:
1. python由于类型不是显式声明,所以除法会把所有数字都当做浮点数来计算,例如:40/2=20.0,而不是20。
2. 整除返回的结果是不大于余数的最大整数。
3. 幂指是python有而C++没有的运算,更方便地代替了C++中的pow函数,2**4即为2的4次方。
1.2 比较运算
>, <, =, >=, <=, !=, ==(易于理解,不再赘述)
1.3 赋值运算
=,及算术运算与等于号组成的联合运算,举个栗子:
a = 1
a += 3 #a此时为4
a *= 2 #a此时为8
a %= 3 #a此时为2
2. String(字符串)
python的字符串用’’(单引号)、""(双引号)均可定义,并且支持常用的转义字符,例如\n、\t等。Python的字符串一旦定义不可修改(与C语言不同),除非生成新的字符串。
s = "Life is short, and I love Python."
s[0] = 'w' #会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
字符串最常用的操作是截取操作、相加操作、相乘操作(更多操作需要了解List类型再补充)。
- 截取操作
>>> s = "Life is short, and I love Python."
>>> s[0] #取第0位的字符
'L'
>>> s[:5] #取0-4的字符组成的字符串
'Life '
>>> s[10:] #取10到最后一个字符组成的子串
'ort, and I love Python.'
>>> s[5:10] #取5-9到字符组成的子串
'is sh'
>>> s[:-8] #索引范围可以为负数,从后往前数,最后一个数字序号为-1
'Life is short, and I love'
- 相加和相乘
a = "I love "
b = "Python"
c = a+b #c = "I love Python"
d = b*3 #d = "PythonPythonPython"
再补充一下,python获取字符串长度可以用内置的len()函数,例如len(s),返回字符串s的长度(类型为一个非负整数)。
字符串和数字类型的转换
数字转为字符串,可以用str()函数。字符串转为数字,需要分别用int()、float()、bool()、complex()等函数,其中转为int和float最常用。
s = str(123)
num = int(s)
fl = float(s)
3. List(列表)
列表用中括号声明,列表中可以存放任意不同类型的元素,灵活性很高,内置的方法也很多。
例如下面的list有5个元素,第五个元素为一个list,里面有三个元素(这样下去可以无限套娃)
l = ['a','b',123,"python",['5','6','7']]
list的截取操作和字符串的截取操作相同,获取长度操作相同,相加和相乘操作也相同(其实字符串也可以看作一个特殊的list)
字符串和列表类型的转换
字符串转列表
- 直接list(String),将会把字符串转为单个字符组成的列表
>>> string = "Python"
>>> list(string)
['P', 'y', 't', 'h', 'o', 'n']
- string.split(),按字符切割字符串,默认为空格,split()函数中可以指定切割符
>>> string1 = "I love Python very much"
>>> string1.split()
['I', 'love', 'Python', 'very', 'much']
>>> string2 = "I love Python very much, and I guess so do you, don't you?"
>>> string2.split(',')
['I love Python very much', ' and I guess so do you', " don't you?"]
列表转字符串
- 直接str(list),会把列表输出的结果直接转为字符串(一般不是我们想要的结果)
>>> a = [5,4,3]
>>> str(a)
'[5, 4, 3]'
>>> b = ['a','b','c']
>>> str(b)
"['a', 'b', 'c']"
- join操作,与split相反的操作,用指定的连接符把由字符串组成的列表合并为一个字符串
>>> b = ['a','b','c']
>>> ",".join(b)
'a,b,c'
列表还有很多常用的方便操作,例如:append为在末尾添加一个元素,max为取列表中最大值,count为统计列表中某一元素的个数,更多操作和详情推荐查看菜鸟教程。
4. Tuple(元组)
元组用小括号声明,元组和列表的区别就是元组不可修改,列表可修改。因此更准确地说,字符串是一种特殊的元组。
元组和列表直接可以随意转换,用list()和tuple()函数互相转换即可。
声明长度为1的元组方法比较特殊,需要在元素后面加逗号,不然会忽略括号识别为单个元素。
元组与字符串可以用类似于列表的方式互相转换。
t = (20,)
5. Set(集合)
python中用大括号声明集合,集合满足无序性、无重复成员等集合的基本性质,并且支持并、交、差、环合(对称差)等运算。
>>> a = {1,2,3}
>>> b = {3,4,5}
>>> a|b #a并b
{1, 2, 3, 4, 5}
>>> a&b #a交b
{3}
>>> a-b #a减b
{1, 2}
>>> a^b #a环合b
{1, 2, 4, 5}
字符串可以转为集合,例如:
>>> s = set("Renmin")
>>> s
{'m', 'n', 'e', 'i', 'R'}
6. Dictionary(字典)
字典是无序的映射关系的集合,不能按下标索引,需要按值索引,本质是哈希表。
映射对又称为键值对(key: value),key在字典中必须唯一,且不可以为列表和字典类型(这两种类型不可哈希,具体原理不用了解),value可以为任意类型。
虽然字典类型不能按下标存取,但字典类型可迭代(简单来讲,就是可以用for循环来遍历整个字典,这一点和列表、元组、字符串是相同的)。
>>> dic = {"one":1,"two":2,"three":3}
>>> dic["one"]
1
>>> dic["one"] = "一"
>>> dic["one"]
'一'
7. 对运算的补充介绍
7.1 赋值运算
python中的赋值运算均为浅复制,即只是传递了对象的地址声明了另一个别名,具体到数值类型和序列类型(包括字符串、列表、元组、集合、字典)有不同的表现。
首先来看数值类型,我们用id()可以获得python中变量的地址。下图的结果可以总结为:
- 每一个值对应一个独特的地址,每一次赋值操作都会改变变量的地址。
- 相同的值的变量拥有相同的地址,例如a和c。
- 赋值运算的本质是将地址赋予了另一个变量,并没有新开空间。
>>> a = 1
>>> b = 2
>>> id(a)
1445946544
>>> id(b)
1445946560
>>> b = a
>>> id(b)
1445946544
>>> b = 3
>>> id(b)
1445946576
>>> c = 1
>>> id(c)
1445946544
接下来看序列类型,我们只需要记住一点,赋值运算的本质是将地址赋予了另一个变量,并没有新开空间,就可以理解python发生的一些从C语言入门角度无法理解的现象了。
下面先定义了a为[1,2,3],然后把a赋给了b,b和a的地址是一样的,接下来改变b,但对于复杂对象b改变之后地址没有改变,a的地址也不会改变,所以再去查看a的时候发现a也被相应修改了。
这是python初学者非常容易犯的错误,bug的50%以上来源是没有理解python的这一特性。
>>> a = [1,2,3]
>>> id(a)
45311160
>>> b = a
>>> id(b)
45311160
>>> b.append(4)
>>> id(b)
45311160
>>> a
[1, 2, 3, 4]
7.2 逻辑运算符
python的逻辑运算符有and、or、not,分别为与、或、非,对应C语言的&&、||、!运算符,可以用于并列两个条件,真值表略。
7.3 成员运算符
主要为in和not in,用于判断一个元素在不在一个序列中(记得序列包括字符串、列表、元组、集合、字典)
>>> a
[1, 2, 3, 4]
>>> a
[1, 2, 3, 4]
>>> a = [1,2,3]
>>> 3 in a
True
>>> 4 in a
False
>>> 0 not in a
True
>>> s = "Python"
>>> 'y' in s
True
>>> t = (2,5,6,8)
>>> 6 in t
True
>>> Set = {2,3,5,6,7,1}
>>> 4 in Set
False
>>> d = {1:1,2:2,3:3}
>>> 1 in d
True
7.4 身份运算符
is和is not,主要判断是否指向地址相同的对象,即判断id是否相同
>>> a = [1,3,4]
>>> b = [1,3,4]
>>> c = b
>>> a is b
False
>>> b is c
True
>>> id(a)
45311240
>>> id(b)
8473216
>>> id(c)
8473216
7.5 位运算符*
同C语言的位运算规则,初学者可以不必了解,详情请见位运算。
学完这篇,大家就可以把python当做一个强大的计算器来使用了,可以写任意的顺序控制语句了,循环和分支等复杂的控制语句留待下一篇再讲。