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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌────────────────────────────────────────────────────────┐
│Command Prompt - □ x │
├────────────────────────────────────────────────────────┤
│Microsoft Windows [Version 10.0.0] │
│(c) 2015 Microsoft Corporation. All rights reserved. │
│ │
│C:\> _ │
│ │
│ │
│ │
│ │
│ │
│ │
│ │
└────────────────────────────────────────────────────────┘

Python交互模式

在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌────────────────────────────────────────────────────────┐
│Command Prompt - python - □ x │
├────────────────────────────────────────────────────────┤
│Microsoft Windows [Version 10.0.0] │
│(c) 2015 Microsoft Corporation. All rights reserved. │
│ │
│C:\> python │
│Python 3.6 ... on win32 │
│Type "help", ... for more information. │
│>>> _ │
│ │
│ │
│ │
│ │
└────────────────────────────────────────────────────────┘

在Python交互模式下输入exit()并回车,就退出了Python交互模式,并回到命令行模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌────────────────────────────────────────────────────────┐
│Command Prompt - □ x │
├────────────────────────────────────────────────────────┤
│Microsoft Windows [Version 10.0.0] │
│(c) 2015 Microsoft Corporation. All rights reserved. │
│ │
│C:\> python │
│Python 3.6 ... on win32 │
│Type "help", ... for more information. │
│>>> exit() │
│ │
│C:\> _ │
│ │
│ │
└────────────────────────────────────────────────────────┘

也可以直接通过开始菜单选择Python (command line)菜单项,直接进入Python交互模式,但是输入exit()后窗口会直接关闭,不会回到命令行模式。

了解了如何启动和退出Python的交互模式,我们就可以正式开始编写Python代码了。

Python基础

输入与输出

输出

print()在括号中加上字符串,就可以向屏幕上输出指定的文字。比如输出'BirdMichael',用代码实现如下:

1
>>> print('BirdMichael')

print()函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出:

1
2
>>> print('BirdMichael', 'is', 'me' ,200+300)
('BirdMichael', 'is', 'me', 500)

print()会依次打印每个字符串,遇到逗号“,”会输出一个空格。

  • 这里实际运行和有点出入

    教程显示应该输出 BirdMichael is me 500,实际运行多了括号并且有,,当输入print'BirdMichael', 'is', 'me' ,200+300时,和教程输出结果一致。(后续跟进)

输入

现在,你已经可以用print()输出你想要的结果了。但是,如果要让用户从电脑输入一些字符怎么办?Python提供了一个input(),可以让用户输入字符串,并存放到一个变量里。

1
2
>>> name = input()
BirdMichael

当你输入name = input()并按下回车后,Python交互式命令行就在等待你的输入了。这时,你可以输入任意字符,然后按回车后完成输入。

输入完成后,不会有任何提示,Python交互式命令行又回到>>>状态了。那我们刚才输入的内容到哪去了?答案是存放到name变量里了。可以直接输入name查看变量内容:

1
2
>>> name
'BirdMichael'

要打印出name变量的内容,除了直接写name然后按回车外,还可以用print()函数:

1
2
>>> print(name)
Michael

小测试

有了输入和输出,我们就可以把程序改成有点意义的程序了:

代码

is your surname')
1
2
3
4
5
print('what is your surname')
surname = input()
print('what is your name')
name = input()
print('your name is',surname, name)

运行结果:

1
2
3
4
5
6
➜  py python 2.py
what is your surname
'Bird'
what is your name
'Michael'
('your name is', 'Bird', 'Michael')

input()可以改写为input('please enter:'),所以我们代码可以改写成:

1
2
3
surname = input('what is your surname :')
name = input('what is your name :')
print('your name is',surname, name)

运行结果:

1
2
3
4
➜  py python 2.py
what is your surname :'Bird'
what is your name :'Michael'
('your name is', 'Bird', 'Michael')

Python基础

Python的语法比较简单,采用缩进方式,写出来的代码就像下面的样子:

1
2
3
4
5
6
7
#coding:utf-8
# 取一个数的绝对值
nub = -40
if nub >= 0:
print(nub)
else :
print(-nub)

#开头的语句是注释,注释是给人看的,可以是任意内容,解释器会忽略掉注释。其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块。

缩进有利有弊。好处是强迫你写出格式化的代码,但没有规定缩进是几个空格还是Tab。按照约定俗成的管理,应该始终坚持使用4个空格的缩进。

缩进的另一个好处是强迫你写出缩进较少的代码,你会倾向于把一段很长的代码拆分成若干函数,从而得到缩进较少的代码。

缩进的坏处就是“复制-粘贴”功能失效了,这是最坑爹的地方。当你重构代码时,粘贴过去的代码必须重新检查缩进是否正确。此外,IDE很难像格式化Java代码那样格式化Python代码。

最后,请务必注意,Python程序是大小写敏感的,如果写错了大小写,程序会报错。

字符串

字符串是以单引号'或双引号"括起来的任意文本,比如'abc'"xyz"等等。请注意,''""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有abc这3个字符。如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I'm,空格,OK这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
2
当需要这样换行时
需要输入 \n

如果字符串里面有很多字符都需要转义,就需要加很多\,为了简化,Python还允许用r''表示''内部的字符串默认不转义,可以自己试试:

1
2
3
4
>>> print('\\\t\\')
\ \
>>> print(r'\\\t\\')
\\\t\\

如果字符串内部有很多换行,用\n写在一行里不好阅读,为了简化,Python允许用'''...'''的格式表示多行内容,可以自己试试:

1
2
3
4
5
6
>>> print('''line1
... line2
... line3''')
line1
line2
line3

上面是在交互式命令行内输入,注意在输入多行内容时,提示符由>>>变为...,提示你可以接着上一行输入,注意...是提示符,不是代码的一部分:

1
2
3
4
5
6
7
8
>>> print('''line1                                      
... line2
... line3''')
line1
line2
line3

>>> _

执行该语句并打印结果。

如果写成程序并存为.py文件,就是:

1
2
3
print('''line1
line2
line3''')

多行字符串'''...'''还可以在前面加上r使用。

代码:

1
2
print(r'''hello,\n
world''')

输出

1
2
hello,\n
world

在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下:

1
2
3
4
>>> 'Hello, %s' % 'world'
'Hello, world'
>>> 'Hi, %s, you have $%d.' % ('Michael', 1000000)
'Hi, Michael, you have $1000000.'

%运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。

常见的占位符有:

占位符 替换内容
%d 整数
%f 浮点数
%s 字符串
%x 十六进制整数

有些时候,字符串里面的%是一个普通字符怎么办?这个时候就需要转义,用%%来表示一个%

1
2
>>> 'growth rate: %d %%' % 7
'growth rate: 7 %'

format()

另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{0}{1}……,不过这种方式写起来比%要麻烦得多:

1
2
>>> 'Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125)
'Hello, 小明, 成绩提升了 17.1%'

布尔值

布尔值和布尔代数的表示完全一致,一个布尔值只有TrueFalse两种值,要么是True,要么是False,在Python中,可以直接用TrueFalse表示布尔值(请注意大小写),也可以通过布尔运算计算出来:

1
2
3
4
5
6
7
8
>>> True
True
>>> False
False
>>> 3 > 2
True
>>> 3 > 5
False

布尔值可以用andornot运算。

and运算是与运算,只有所有都为Trueand运算结果才是True

1
2
3
4
5
6
7
8
>>> True and True
True
>>> True and False
False
>>> False and False
False
>>> 5 > 3 and 3 > 1
True

or运算是或运算,只要其中有一个为Trueor运算结果就是True

1
2
3
4
5
6
7
8
>>> True or True
True
>>> True or False
True
>>> False or False
False
>>> 5 > 3 or 1 > 3
True

not运算是非运算,它是一个单目运算符,把True变成FalseFalse变成True

1
2
3
4
5
6
>>> not True
False
>>> not False
True
>>> not 1 > 2
True

布尔值经常用在条件判断中,比如:

1
2
3
4
if age >= 18:
print('adult')
else:
print('teenager')

空值

空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。

变量赋值

理解变量在计算机内存中的表示也非常重要。当我们写:

1
a = 'ABC'

时,Python解释器干了两件事情:

  1. 在内存中创建了一个'ABC'的字符串;
  2. 在内存中创建了一个名为a的变量,并把它指向'ABC'

也可以把一个变量a赋值给另一个变量b,这个操作实际上是把变量b指向变量a所指向的数据,例如下面的代码:

1
2
3
4
a = 'ABC'
b = a
a = 'XYZ'
print(b)

最后一行打印出变量b的内容到底是'ABC'呢还是'XYZ'?如果从数学意义上理解,就会错误地得出ba相同,也应该是'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
2
classmates = ['Michael', 'Bob', 'Tracy']
print classmates

输出

1
['Michael', 'Bob', 'Tracy']
len()

len()函数可以获得list元素的个数。

代码:

1
2
classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy']
print len(classmates)

输出:

1
5
list中对应索引元素
正序

[1]索引来访问list中每一个位置的元素,记得索引是从0开始的。

代码:

1
2
classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy']
print classmates[4]

输出:

1
Ivy
最后一个元素

在确保索引不越界的情况下,最后一个元素的索引是len(classmates) - 1

代码:

1
2
classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael']
print classmates[len(classmates)-1]

输出:

1
BirdMichael

要取最后一个元素,除了计算索引位置外,还可以用-1做索引,直接获取最后一个元素。

代码:

1
2
classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael']
print classmates[-1]

输出:

1
BirdMichael
倒序

知道了取最后一个元素的方法,以此类推,可以获取倒数第2个、倒数第3个。

代码:

1
2
3
classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael']
print classmates[-2]
print classmates[-4]

输出:

1
2
Ivy
Tracy
append()添加元素

list是一个可变的有序表,所以,可以往list中追加元素到末尾。

代码:

1
2
3
classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael']
classmates.append('Adam')
print classmates

输出:

1
['Michael', 'Bob', 'Tracy', 'Aki', 'Ivy', 'BirdMichael', 'Adam']
insert()插入元素

也可以把元素插入到指定的位置,比如索引号为1的位置。

1
2
3
classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael']
classmates.insert(1,'Jack')
print classmates

输出:

1
['Michael', 'Jack', 'Bob', 'Tracy', 'Aki', 'Ivy', 'BirdMichael']
pop()删除末尾元素

要删除list末尾的元素,用pop()方法,删除指定位置的元素,用pop(i)方法,其中i是索引位置。

代码:

1
2
3
4
5
classmates = ['Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael']
classmates.pop()
print classmates
classmates.pop(1)
print classmates

输出:

1
2
['Michael', 'Bob', 'Tracy', 'Aki', 'Ivy']
['Michael', 'Tracy', 'Aki', 'Ivy']

tuple

另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。

代码:

1
2
classmates = ('Michael', 'Bob', 'Tracy','Aki','Ivy','BirdMichael')
print classmates

输出:

1
('Michael', 'Bob', 'Tracy', 'Aki', 'Ivy', 'BirdMichael')

tuple不可变,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用classmates[0]classmates[-1],但不能赋值成另外的元素。

(错误示范)定义一个只有1个元素的tuple,如果你这么定义:

1
2
3
>>> t = (1)
>>> t
1

定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1

所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义:

1
2
3
>>> t = (1,)
>>> t
(1,)

Python在显示只有1个元素的tuple时,也会加一个逗号,,以免你误解成数学计算意义上的括号。

这样看比较容易理解:

1
2
3
>>> d = (1)
>>> d + d
2

条件判断

主要说一下,根据Python的缩进规则,如果if语句判断是True,就把缩进的语句执行了,否则,什么也不做。理解下面代码就知道了。

代码:

1
2
3
4
5
6
7
8
9
10
11
age = 10
age1 = 20
if age1 >= 18:
print('1,your age is', age)
print('1')
if age >= 18:
print('2,your age is', age)
print('2')
if age >= 18:
print('3,your age is', age)
print('3')

输出:

1
2
3
('1,your age is', 10)
1
3

dict和set

dict

in

要避免key不存在的错误,有两种办法,一是通过in判断key是否存在:

代码:

1
2
3
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
print ('Thomas','Thomas' in d)
print ('Bob','Bob' in d)

输出:

1
2
('Thomas', False)
('Bob', True)
get()

二是通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value:

代码:

1
2
3
4
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
print ('Thomas',d.get('Bob'))
print ('Bob',d.get('Ivy'))
print ('Bob',d.get('Aki','NO Data'))

输出:

1
2
3
('Thomas', 75)
('Bob', None)
('Bob', 'NO Data')

注意:返回None的时候Python的交互环境不显示结果。

pop(key)

要删除一个key,用pop(key)方法,对应的value也会从dict中删除:

1
2
3
4
>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}

set

set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

要创建一个set,需要提供一个list作为输入集合:

1
2
3
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}

注意,传入的参数[1, 2, 3]是一个list,而显示的{1, 2, 3}只是告诉你这个set内部有1,2,3这3个元素,显示的顺序也不表示set是有序的。。

重复元素在set中自动被过滤:

1
2
3
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}

通过add(key)方法可以添加元素到set中,可以重复添加,但不会有效果:

1
2
3
4
5
6
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}

通过remove(key)方法可以删除元素:

1
2
3
>>> s.remove(4)
>>> s
{1, 2, 3}

set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:

1
2
3
4
5
6
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}

set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。