python学习第一天,python基础操作
安装Python
因为Python是跨平台的,它可以运行在Windows、Mac和各种Linux/Unix系统上。在Windows上写Python程序,放到Linux上也是能够运行的。
在Mac上安装Python
如果你正在使用Mac,系统是OS X 10.8~10.10,那么系统自带的Python版本是2.7。要安装最新的Python 3.6,有两个方法:
方法一:从Python官网下载Python 3.6的安装程序(网速慢的同学请移步国内镜像),双击运行并安装;
方法二:如果安装了Homebrew,直接通过命令brew install python3
安装即可。
在Windows上安装Python
首先,根据你的Windows版本(64位还是32位)从Python的官方网站下载Python 3.6对应的64位安装程序或32位安装程序(网速慢的同学请移步国内镜像),然后,运行下载的EXE安装包:
特别要注意勾上Add Python 3.6 to PATH
,然后点“Install Now”即可完成安装。
Python开发工具Atom
Atom简介
Atom是Github开发的一款免费的、功能非常强大的编辑器,它可以通过安装包的方式来扩展其功能。可以使用它来开发很多应用,例如:Web前端、JavaScript、CSS、HTML、Python、Ruby等等。原文查看
下载安装Atom
Atom的官方网站是:https://atom.io/,进入网站,根据你的系统类型下载相应的安装文件。Atom的安装非常简单,基本上就是一路下一步,傻瓜式安装。
安装Python开发包及插件
下载安装好了Atom,还需要安装一个包,这个包可以用来之间运行Python代码,包的名字是“atom-runner”。打开菜单项“File”->“Settings”,点击“install”,输入“atom-runner”搜索,然后点击安装即可。
其他插件
代码高亮:Atom自带
自动补全:(https://link.zhihu.com/?target=https%3A//atom.io/packages/autocomplete-python)
语法检查:linter-flake8
定义跳转:python-tools
Python运行模式
在正式编写第一个Python程序前,我们先复习一下什么是命令行模式和Python交互模式。
命令行模式
在Windows开始菜单选择“命令提示符”,就进入到命令行模式,它的提示符类似C:\>
:
1 | ┌────────────────────────────────────────────────────────┐ |
Python交互模式
在命令行模式下敲命令python
,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>
。
1 | ┌────────────────────────────────────────────────────────┐ |
在Python交互模式下输入exit()
并回车,就退出了Python交互模式,并回到命令行模式:
1 | ┌────────────────────────────────────────────────────────┐ |
也可以直接通过开始菜单选择Python (command line)
菜单项,直接进入Python交互模式,但是输入exit()
后窗口会直接关闭,不会回到命令行模式。
了解了如何启动和退出Python的交互模式,我们就可以正式开始编写Python代码了。
Python基础
输入与输出
输出
用print()
在括号中加上字符串,就可以向屏幕上输出指定的文字。比如输出'BirdMichael'
,用代码实现如下:
1 | 'BirdMichael') print( |
print()
函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出:
1 | >>> print('BirdMichael', 'is', 'me' ,200+300) |
print()
会依次打印每个字符串,遇到逗号“,”会输出一个空格。
这里实际运行和有点出入
教程显示应该输出
BirdMichael is me 500
,实际运行多了括号并且有,
,当输入print'BirdMichael', 'is', 'me' ,200+300
时,和教程输出结果一致。(后续跟进)
输入
现在,你已经可以用print()
输出你想要的结果了。但是,如果要让用户从电脑输入一些字符怎么办?Python提供了一个input()
,可以让用户输入字符串,并存放到一个变量里。
1 | >>> name = input() |
当你输入name = input()
并按下回车后,Python交互式命令行就在等待你的输入了。这时,你可以输入任意字符,然后按回车后完成输入。
输入完成后,不会有任何提示,Python交互式命令行又回到>>>
状态了。那我们刚才输入的内容到哪去了?答案是存放到name
变量里了。可以直接输入name
查看变量内容:
1 | >>> name |
要打印出name
变量的内容,除了直接写name
然后按回车外,还可以用print()
函数:
1 | >>> print(name) |
小测试
有了输入和输出,我们就可以把程序改成有点意义的程序了:
代码
1 | print('what is your surname') |
运行结果:
1 | ➜ py python 2.py |
而input()
可以改写为input('please enter:')
,所以我们代码可以改写成:
1 | surname = input('what is your surname :') |
运行结果:
1 | ➜ py python 2.py |
Python基础
Python的语法比较简单,采用缩进方式,写出来的代码就像下面的样子:
1 | #coding:utf-8 |
以#
开头的语句是注释,注释是给人看的,可以是任意内容,解释器会忽略掉注释。其他每一行都是一个语句,当语句以冒号:
结尾时,缩进的语句视为代码块。
缩进有利有弊。好处是强迫你写出格式化的代码,但没有规定缩进是几个空格还是Tab。按照约定俗成的管理,应该始终坚持使用4个空格的缩进。
缩进的另一个好处是强迫你写出缩进较少的代码,你会倾向于把一段很长的代码拆分成若干函数,从而得到缩进较少的代码。
缩进的坏处就是“复制-粘贴”功能失效了,这是最坑爹的地方。当你重构代码时,粘贴过去的代码必须重新检查缩进是否正确。此外,IDE很难像格式化Java代码那样格式化Python代码。
最后,请务必注意,Python程序是大小写敏感的,如果写错了大小写,程序会报错。
字符串
字符串是以单引号'
或双引号"
括起来的任意文本,比如'abc'
,"xyz"
等等。请注意,''
或""
本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'
只有a
,b
,c
这3个字符。如果'
本身也是一个字符,那就可以用""
括起来,比如"I'm OK"
包含的字符是I
,'
,m
,空格,O
,K
这6个字符。
'
输出
代码:
1 | print("i'm ok!") |
输出:
1 | i'm ok! |
"
输出
如果字符串内部既包含'
又包含"
怎么办?可以用转义字符\
来标识,比如:
代码:
1 | print("i'm \"BirdMichael\"") |
输出:
1 | i'm "BirdMichael" |
转义字符\
可以转义很多字符,比如\n
表示换行,\t
表示制表符,字符\
本身也要转义,所以\\
表示的字符就是\
,可以在Python的交互式命令行用print()
打印字符串看看:
代码:
1 | print("当需要这样换行时\n需要输入 \\n") |
输出:
1 | 当需要这样换行时 |
如果字符串里面有很多字符都需要转义,就需要加很多\
,为了简化,Python还允许用r''
表示''
内部的字符串默认不转义,可以自己试试:
1 | >>> print('\\\t\\') |
如果字符串内部有很多换行,用\n
写在一行里不好阅读,为了简化,Python允许用'''...'''
的格式表示多行内容,可以自己试试:
1 | >>> print('''line1 |
上面是在交互式命令行内输入,注意在输入多行内容时,提示符由>>>
变为...
,提示你可以接着上一行输入,注意...
是提示符,不是代码的一部分:
1 | >>> print('''line1 |
执行该语句并打印结果。
如果写成程序并存为.py
文件,就是:
1 | print('''line1 |
多行字符串'''...'''
还可以在前面加上r
使用。
代码:
1 | print(r'''hello,\n |
输出
1 | hello,\n |
在Python中,采用的格式化方式和C语言是一致的,用%
实现,举例如下:
1 | >>> 'Hello, %s' % 'world' |
%
运算符就是用来格式化字符串的。在字符串内部,%s
表示用字符串替换,%d
表示用整数替换,有几个%?
占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?
,括号可以省略。
常见的占位符有:
占位符 | 替换内容 |
---|---|
%d | 整数 |
%f | 浮点数 |
%s | 字符串 |
%x | 十六进制整数 |
有些时候,字符串里面的%
是一个普通字符怎么办?这个时候就需要转义,用%%
来表示一个%
:
1 | >>> 'growth rate: %d %%' % 7 |
format()
另一种格式化字符串的方法是使用字符串的format()
方法,它会用传入的参数依次替换字符串内的占位符{0}
、{1}
……,不过这种方式写起来比%要麻烦得多:
1 | >>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125) |
布尔值
布尔值和布尔代数的表示完全一致,一个布尔值只有True
、False
两种值,要么是True
,要么是False
,在Python中,可以直接用True
、False
表示布尔值(请注意大小写),也可以通过布尔运算计算出来:
1 | >>> True |
布尔值可以用and
、or
和not
运算。
and
运算是与运算,只有所有都为True
,and
运算结果才是True
:
1 | >>> True and True |
or
运算是或运算,只要其中有一个为True
,or
运算结果就是True
:
1 | >>> True or True |
not
运算是非运算,它是一个单目运算符,把True
变成False
,False
变成True
:
1 | >>> not True |
布尔值经常用在条件判断中,比如:
1 | if age >= 18: |
空值
空值是Python里一个特殊的值,用None
表示。None
不能理解为0
,因为0
是有意义的,而None
是一个特殊的空值。
变量赋值
理解变量在计算机内存中的表示也非常重要。当我们写:
1 | a = 'ABC' |
时,Python解释器干了两件事情:
- 在内存中创建了一个
'ABC'
的字符串; - 在内存中创建了一个名为
a
的变量,并把它指向'ABC'
。
也可以把一个变量a
赋值给另一个变量b
,这个操作实际上是把变量b
指向变量a
所指向的数据,例如下面的代码:
1 | a = 'ABC' |
最后一行打印出变量b
的内容到底是'ABC'
呢还是'XYZ'
?如果从数学意义上理解,就会错误地得出b
和a
相同,也应该是'XYZ'
,但实际上b
的值是'ABC'
,让我们一行一行地执行代码,就可以看到到底发生了什么事:
执行a = 'ABC'
,解释器创建了字符串'ABC'
和变量a
,并把a
指向'ABC'
:
执行b = a
,解释器创建了变量b
,并把b
指向a
指向的字符串'ABC'
:
执行a = 'XYZ'
,解释器创建了字符串’XYZ’,并把a
的指向改为'XYZ'
,但b
并没有更改:
所以,最后打印变量b
的结果自然是'ABC'
了。
1 | * 对应iOS理解,所有赋值内存属性都为"浅复制" |
list和tuple
list和tuple是Python内置的有序集合,两个极其相似。一个可变,一个不可变。因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple,根据需要来选择使用它们。
list
Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。list里面的元素的数据类型也可以不同。元素也可以是另外一个list构成二位list。
代码:
1 | classmates = ['Michael', 'Bob', 'Tracy'] |
输出
1 | ['Michael', 'Bob', 'Tracy'] |
len()
len()
函数可以获得list元素的个数。
代码:
1 | classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy'] |
输出:
1 | 5 |
list中对应索引元素
正序
用[1]
索引来访问list中每一个位置的元素,记得索引是从0
开始的。
代码:
1 | classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy'] |
输出:
1 | Ivy |
最后一个元素
在确保索引不越界的情况下,最后一个元素的索引是len(classmates) - 1
。
代码:
1 | classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael'] |
输出:
1 | BirdMichael |
要取最后一个元素,除了计算索引位置外,还可以用-1
做索引,直接获取最后一个元素。
代码:
1 | classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael'] |
输出:
1 | BirdMichael |
倒序
知道了取最后一个元素的方法,以此类推,可以获取倒数第2个、倒数第3个。
代码:
1 | classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael'] |
输出:
1 | Ivy |
append()
添加元素
list是一个可变的有序表,所以,可以往list中追加元素到末尾。
代码:
1 | classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael'] |
输出:
1 | ['Michael', 'Bob', 'Tracy', 'Aki', 'Ivy', 'BirdMichael', 'Adam'] |
insert()
插入元素
也可以把元素插入到指定的位置,比如索引号为1
的位置。
1 | classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael'] |
输出:
1 | ['Michael', 'Jack', 'Bob', 'Tracy', 'Aki', 'Ivy', 'BirdMichael'] |
pop()
删除末尾元素
要删除list末尾的元素,用pop()
方法,删除指定位置的元素,用pop(i)
方法,其中i
是索引位置。
代码:
1 | classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael'] |
输出:
1 | ['Michael', 'Bob', 'Tracy', 'Aki', 'Ivy'] |
tuple
另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。
代码:
1 | classmates = ('Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael') |
输出:
1 | ('Michael', 'Bob', 'Tracy', 'Aki', 'Ivy', 'BirdMichael') |
tuple不可变,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0]
,classmates[-1]
,但不能赋值成另外的元素。
(错误示范)定义一个只有1个元素的tuple,如果你这么定义:
1 | >>> t = (1) |
定义的不是tuple,是1
这个数!这是因为括号()
既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1
。
所以,只有1个元素的tuple定义时必须加一个逗号,
,来消除歧义:
1 | >>> t = (1,) |
Python在显示只有1个元素的tuple时,也会加一个逗号,
,以免你误解成数学计算意义上的括号。
这样看比较容易理解:
1 | >>> d = (1) |
条件判断
主要说一下,根据Python的缩进规则,如果if
语句判断是True
,就把缩进的语句执行了,否则,什么也不做。理解下面代码就知道了。
代码:
1 | age = 10 |
输出:
1 | ('1,your age is', 10) |
dict和set
dict
in
要避免key不存在的错误,有两种办法,一是通过in
判断key是否存在:
代码:
1 | d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} |
输出:
1 | ('Thomas', False) |
get()
二是通过dict提供的get()
方法,如果key不存在,可以返回None
,或者自己指定的value:
代码:
1 | d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} |
输出:
1 | ('Thomas', 75) |
注意:返回None
的时候Python的交互环境不显示结果。
pop(key)
要删除一个key,用pop(key)
方法,对应的value也会从dict中删除:
1 | >>> d.pop('Bob') |
set
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
要创建一个set,需要提供一个list作为输入集合:
1 | >>> s = set([1, 2, 3]) |
注意,传入的参数[1, 2, 3]
是一个list,而显示的{1, 2, 3}
只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。。
重复元素在set中自动被过滤:
1 | >>> s = set([1, 1, 2, 2, 3, 3]) |
通过add(key)
方法可以添加元素到set中,可以重复添加,但不会有效果:
1 | >>> s.add(4) |
通过remove(key)
方法可以删除元素:
1 | >>> s.remove(4) |
set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
1 | >>> s1 = set([1, 2, 3]) |
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。