学习大数据与机器学习至少要掌握一门编程语言,Python语言学起来非常简单,又容易使用,且功能强大,对于零基础的朋友来说是最佳的入门语言。本文是Python大数据与机器学习系列文章中的第4篇,将带大家快速入门Python编程。
如果读者已经有Python编程经验,请跳过本文。
本文将会介绍如下内容:
数据类型:
数字(Numbers)
字符串(Strings)
格式化答打印(Print Formatting)
列表(Lists)
字典(Dictionaries)
布尔值(booleans)
元组和集合(Tuples 和 Sets)
比较运算符
if, elif和else语句
for循环
while循环
range()
list操作
函数
Lambda表达式
Map和Filter
由于内容较多,害怕大家收藏不看,因此小编将其分成两篇介绍。希望大家能够多练习,快速掌握Python编程语言,为之后的学习打下坚实的基础。
为了能够更有趣一些,本文会将上述知识点打乱顺序,把一些相关内容结合在一起介绍。这样大家更有耐心看下去。
任何一门语言,都少不了一个概念,就是变量。
变量
简单得说,变量就是编程中最基本的存储单位。变量会暂时性地储存你放进去的东西。
如果用编程语言来表达的话,就是如下等式,一个叫做"answer"的变量被赋值为42。正如每个人都有姓名一样,变量的名字叫做标识符。
现在我们来试着给变量赋值。为了最简单的完成这一步,Windows用户请打开命令行或者Anaconda Prompt,输入Python并回车,然后输入下图红框部分的代码,分别给4个变量赋值。再试着输入a并回车,你会看到赋值的结果,再输入b、c、d也能看到相应值。需要注意的是,Python对大小写是敏感的,"a"和"A"会是两个不同的变量,而不是同一个。
这样,你就学会给变量起名字了,并且他们随叫随到。
打印是Python中最常用的功能,顾名思义,我们现在就简单的把print()这个功能理解为展示打印的结果。使用方法是把你要打印查看结果的对象塞进括号中,这样就可以了。
(如果你的print不用括号也能使用,请检查你的Python版本,为了方便快速理解编程概念和少走弯路,后面的所有例子都会用Py实现)
如果你使用命令行或终端直接输入print(a),你会得到下图的结果。这时因为你漏掉了变量的赋值,Python是无法打印不存在的对象的。
在今后的学习中我们还有很多很多的东西要进行"打印",我们需要知道将会打印出来的东西是什么。即便变量是最容易理解的基础知识,也不要因为简单而就随意命名,一定要保持Python代码的可读性。
看看下面这段代码,即便你现在不知道其中一些细节,但是读了一遍之后,你也能大概猜到这段代码做了什么事情吧?
file = open('E:/tmp/te;,'w')
('hello world!')
由于这是你敲的第一段代码,所以在这里多说几句。首先需要注意语法问题,使用英文标点符号、大小写不要出错、空格不能少。其次要注意文件路径问题,你的E:/tmp/test/路径里不需要有这个文件,但你需要知道你的电脑上的路径是什么,然后把E:/tmp/test/替换掉。查看文件路径的方法是,windows用户用资源管理器打开桌面上的一个文件,查看路径。
这段代码打开了E:/tmp/test/路径里的文件,并写入了Hello World! w代表着如果桌面上有这个文件就直接写入hello world,如果没有这个文件就创建一个这样的文件。
互联网上有着诸多的代码和教程,但如果你没能一眼看懂这段代码是什么意思,其中有一多半是变量命名不清楚造成的困惑。因此在随后的教程中,哪怕很啰嗦,我也会使用清晰的命名方式,从而来保证即便是没有计算机基础的人,也能够理解代码。
要保持良好的命名习惯应该尽量使用英文命名,学编程的同学还能背单词,岂不一举两得,过一阵子你就会发现英文教程也会阅读的很顺畅。
在这里先了解这么多,更深入的会在之后介绍。
字符串
字符串是什么
在上面我们已经初步接触到了字符串,很简单地说,字符串就是......
字符串的基本用法
现在我们来试着了解一些字符串的基本用法——合并。请在你的jupyter notebook中输入如下内容并执行。
what_he_does = ' plays '
his_instrument = 'guitar'
his_name = 'Robert Johnson'
artist_intro = his_name + what_he_does + his_instrument
print(artist_intro)
你会发现输出了这样的结果:
Robert Johnson plays guitar
也许你已经注意到了,上面我们说到变量的时候,有些变量被进行不同形式的赋值。我们现在试着在Jupyter中执行如下语句:
num = 1
string = '1'
print(num + string)
你一定会得到如下的结果,原因是字符串(string)只是Python中的一种数据类型,另一种数据类型则称之为整数(integer),而不同的数据类型是不能够进行合并的,但是通过一些方法可以得到转换。
插一句,如果你不知道变量是什么类型,可以通过type()函数来查看类型。如下演示。
print(type(word))
接下来,我们来转化数据类型。我们需要将转化后的字符串存储在另一个变量中,试着输入这些:
num=1
string='1'
num2 = int(string)
print(num + num2)
这样被转换成了同种类型之后,就可以合并这两个变量了。
我们来做一些更有意思的事情,既然字符串可以相加,那么字符串之间能不能相乘?当然可以!输入代码:
words = 'words' * 3
print(words)
你将会看到输出了wordswordswords
好,现在我们试着解决一个更复杂的问题:
word = 'a loooooong word'
num = 12
string = 'bang!'
total = string * (len(word) - num)
print(total)
到这里,你就掌握了字符串最基本的用法了。是不是很激动,加油~~
字符串的分片与索引
字符串可以通过string[x]的方式进行索引、分片,也就是加一个[]。字符串的分片(slice)实际上可以看作是从字符串中找出来你要截取的东西,复制出来一小段你要的长度,储存在另一个地方,而不会对字符串这个源文件改动。分片获得的每个字符串可以看作是原字符串的一个副本。
先来看下面这段代码。如果你对字符串变量后面一些莫名其妙的数字感到困惑和没有头绪的话,不妨对照着代码下面的这个表格来分析。
name = 'My name is Mike'
print(name[0]) #'M'
print(name[-4]) #'M'
print(name[11:14]) #'Mik'
print(name[11:15]) #'Mike'
print(name[5:]) #'me is Mike'
print(name[:5]) #'My na'
:两边分别代表着字符串的分割从哪里开始,并到哪里结束。
以name[11:14]为例,截取的编号从第11个字符开始,到位置为14但不包含第14个字符结束。
而像name[5:]这样的写法代表着从编号为5的字符到结束的字符串分片。
相反,name[:5]则代表着从编号为0的字符开始到编号为5但不包含第5个字符的字符分片。可能容易搞混,可以想象成第一种是从5到最后面,程序员懒得数有多少个所以就省略地写。第二种是从最前面到5,同样是懒得写0,所以就写成了[:5]。
好,现在我们试着解决一个更复杂的问题,来做一个文字小游戏叫做——”找出你朋友中的魔鬼“。输入代码:
word = 'friends'
find_the_evil_in_your_friends = \
word[0] + word[2:4] + word[-3:-1]
print(find_the_evil_in_your_friends)
注:过长的代码段可以使用'\'来进行换行
如果运行正常,你就会发现这样的答案:fiend
也就发现了朋友中的魔鬼(get到了吗?)。
再来看一个实际项目中的应用,同样是分片的用法。
';
';
';
';
在实际项目中切片十分好用。上面几个网址(网址经过处理,所以你是打不开的)是使用Python编写爬虫后,从网页中解析出来的部分图片链接,现在总共有5000余张附有这样链接的图片需要进行下载,也就是说我需要给这500张不同格式的图片(png,jpg,gif)以一个统一的方式进行命名。通过观察规律,决定以链接尾部倒数10个字符的方式进行命名,于是输入代码如下:
url = ';
file_name = url[-10:]
print(file_name)
你会得到这样的结果:0kuwex.jpg
字符串的方法
Python是面向对象进行编程的语言,而对象拥有各种功能、特性,专业术语称之为——方法(Method)。为了方便理解,我们假定日常生活中的车是”对象“,即car。然后总所周知,汽车有着很多特性和功能,其中'开'就是汽车一个重要功能,于是汽车这个对象使用'开'这个功能,我们在Python编程中就可以表述成这样:car.drive()
字符串替换方法replace()。
phone_number = '1386-666-0006'
hiding_number = (phone_number[:9], '*' * 9)
print(hiding_number)
replace方法的括号中,第一个phone_number[:9]代表要被替换掉的部分,后面的'*'*9表示将要替换成什么字符,也就是把*乘以9,显示9个*。
你会得到这样的结果:*********0006
字符串格式化符format:
__a word she can get what she __ for.
A. With B.came
这样的填空题会让我们印象深刻,当字符串中有多个这样的”空“需要填写的时候,我们可以使用.format()进行批处理,它的基本使用方法有如下几种,输入代码:
print('{} a word she can get what she {} for'.format('with','came'))
print('{preposition} a word she can get what she {verb} for'.format(preposition = 'with', verb = 'came'))
print('{0} a word she can get what she {1} for'.format('with','came'))
好了,到这里你就掌握了变量和字符串的基本概念和常用方法。
下一步,我们会继续学习更深一步的循环与函数。
通过观察规律其实不难发现,Python中所谓的使用函数就是把你要处理的对象放到一个名字后面的括号里就可以了。简单的来说,函数就是这么使用,可以往里面塞东西就得到处理结果。这样的函数在Python中还有这些:
以最新的3.5版本为例,一共存在68个这样的函数,它们被统称为内建函数(Built-in Functions)。之所以被称之为内建函数,并不是因为还有”外建函数“这个概念,内建的意思是这些函数在3.5版本安装完成后你就可以使用它们,是”自带“的而已。千万不要为这些述语搞晕了头,随着往后学习,我们还能看见更多这样的术语,其实都只是很简单的概念,毕竟在一个专业领域内为了表达准确和高效往往会使用专业述语。
现在你并不必急着把这些函数是怎么用的都搞明白,其中一些内建函数很实用,但是另外一些就不常用,比如涉及字符编码的函数ascii(),bin(),chr()等等,这些都是相对底层的编程涉及中才会使用到的函数,在你深入到一定程度的时候才会派的上用场。
开始创建函数
我们需要学会使用已有的函数,更需要学会创建新的函数。自带的函数数量是有限的,想要让Python帮助我们做更多的事情,就要自己设计符合使用需求的函数。创建函数也很简单,其实我们在多年前的初中课堂上,早已掌握了其原理。
先试着在Jupyter输入这样的公式:
看着有点眼熟吧。第一个是数学的梯形计算公式,而第二个是物理的摄氏度与华氏度的转换公式。
函数是编程中最基本的魔法,但同时一切的复杂又都被隐含其中。它的原理和我们学习的数学公式相似,但是并不完全一样,等到后面一点你就知道我为什么这么说了。这里面先介绍几个常见的词。
def(即define,定义)的含义是创建函数,也就是定义一个函数。
arg(即argument,参数)有时你还能见到这种写法:parameter,二者都是参数的意思,但是稍有不同,这里不展开说了。
return即返回结果。
好,现在我们读一遍咒语:Define a function named 'function' which has two arguments: arg1 and arg2, returns the result——'Something'是不是很易读很顺畅?代码的表达比英文句子更简洁一点:
需要注意的是:
def和return是关键字keyword,Python就是靠识别这些特定的关键字来明白用户的意图,实现更为复杂的编程,像这样的关键字还有一些,在后面,我们会细致讲解。
在闭合括号后面的冒号必不可少,而且非常值得注意的是,你要使用英文输入法进行输入,否则就是错误的语法,如果你在Jupyter中输入中文的冒号和括号,会有这样的错误提示。
如果在Jupyter中冒号后面回车(换行)你会自动得到一个缩进。函数缩进后面的语句被称作是语句块(block),缩进是为了表明语句和逻辑的从属关系,是Python最显著的特征之一,有些语言会用花括号表示从属关系,这大大降低了代码的可读性,因此珍爱生命从缩进开始。
现在我们看一下之前提到的摄氏度转化公式,按照上面定义函数的方法来实现一遍。我们把摄氏度转化定义为函数fahrenheit_converter(),那么将输入进去的必然是摄氏度的数值,我们把C设为参数,最后返回的是华氏度的数值,我们用下面的函数来表达,输入代码:
def fahrenheit_converter(C):
fahrenheit = C * 9/5 + 32
return str(fahrenheit) + '℉'
输入完以上代码后,函数定义完成,那么我们开始使用它,我们把使用函数这种行为叫做"调用"(call),你可以简单的理解成你请求Python给你帮忙去做一件事情。
下面这段代码意味着——“请使用摄氏度转换器将35摄氏度转换成华氏度,将结果存储在名为C2F的变量并打印出来。”这样我们就完成了函数的调用同时打印了结果。
C2F = fahrenheit_converter(35)
print(C2F)
到这里,函数的定义和基本用法,你就已经了解,在很长一段时间内,你知道上面所讲的这些内容就基本够用了。
假设a=10,b=20,则运算示例如下:
逻辑控制
逻辑判断——True和False
逻辑判断是编程语言最有意思的地方,如果要实现一个复杂的功能或程序,逻辑判断必不可少。if-else结果就是常见的逻辑控制的手段,当你写出这样的语句的时候,就意味着你告诉了计算机什么时候该怎么做,或者什么是不用做的。学完了前面的内容之后,现在的你也许早已对逻辑控制摩拳擦掌、跃跃欲试,但是在这之前我们需要先了解逻辑判断的最基本准则——布尔类型(Boolean Type)。
在开始前,我想强调一点,如果你怀疑自己的逻辑能力,从而对本章的内容感到畏惧的话,我可以负责任地说,没有人是“没有逻辑的”,正如我们可以在极其复杂的现实世界中采取各种行动一样,你所需要的只不过是一些判断的知识和技巧而已。
布尔类型(Boolean)的数据只有两种,True和False(需要注意的是首字母大写)。人类以真伪来判断事实,而在计算机世界中真伪对应着的则是1和0.
接下来我们打开Jupyter Notebook,敲入这些代码,
1 > 2
1 < 2 < 3
42 != '42'
'Name' == 'name'
'M' in 'Magic'
number = 12
number is 12
我们每输入一行代码就会立即得到结果,这几行代码的表达方式不同,但是返回结果却只有True和False这两种布尔类型,因此我们称但凡能够产生一个布尔值的表达式为布尔表达式(Boolean Expressions)。
可以看到,上面这些能够产生布尔值的方法或者公式不尽相同,那么我们来一一讲解这些运算符号的意义和用法。
比较运算(Comparison)
对于比较运算符,顾名思义,如果比较成立那么则返回True,不成立则返回False。
除了一些在数学上显而易见的事实之外,比较运算还支持更为复杂的表达方式,例如:
多条件比较。先给变量赋值,并在多条件下比较大小:
middle=5
1<middle<10
变量的比较。将两个运算结果存储在不同的变量中,再进行比较:
two=1+1
three=1+3
two<three
字符串的比较。其实就是对比左右两边的字符串是否完全一致,下面的代码就是不一致的,因为在Python中有着严格的大小写区分:
'Eddie Van Helen' == 'eddie van helen'
两个函数产生的结果进行比较:比较运算符两边会先行调用函数后再进行比较,其结果等价于10 > 19
abs(-10) > len('length of this word')
注:abs()是一个会返回输入参数的绝对值的函数。
比较运算符的一些小问题
不同类型的对象不能使用"<,>,<=,>="进行比较,却可以使用'=='和'!=',例如字符串和数字:
42 > the answer' 无法比较
42 == 'the answer' #False
42 != 'the answer' #True
需要注意的是,浮点和整数虽然是不同类型,但是不影响到比较运算:
5.0==5 #True
3.0>1 #True
你可能会有一个疑问,”为什么1=1要写作1==1“,前面提及过Python中的符号在很多地方都和数学中十分相似,但又不完全一样。”=“在Python中代表着赋值,并非我们熟悉的”等于“。所以,”1=1“这种写法并不成立,并且它也不会给你返回一个布尔值。使用”==“这种表达方式,姑且可以理解成是表达这两个对象的值是相等的,这是一种约定俗称的语法,记得就可以了。
比较了字符串、浮点、整数...还差一个类型没有进行比较:布尔类型,那么现在实验一下:
True>False
True+False>False+False
这样的结果又怎么理解呢?还记得前面说过的吗,True和False对于计算机就像是1和0一样,如果在Jupyter中敲入True+True+False查看结果不难发现,True=1,False=0也就是说,上面这段代码实际上等价于:
1>0
1+0>0+0
至于为什么是这样的原因,我们不去深究,还是记得即可。
最后一个小问题,如果在别的教程中看到类似1<>3这种表达式也不要大惊小怪,它其实与1!=3是等价的,仅仅知道就可以,并不是要让你知道”茴字的四种写法“。
成员运算符与身份运算符
成员运算符和身份运算符的关键词是in与is。把in放在两个对象中间的含义是,测试前者是否存在于in后面的集合中。说到集合,我们先在这里介绍一个简单易懂的集合类型——列表(List)。
字符串、浮点、整数、布尔类型、变量甚至是另一个列表都可以储存在列表中,列表是非常实用的数据结构,在后面会花更多篇幅来讲解列表的用法,这里先简单了解一下。
创建一个列表,就像是创建变量一样,要给它起个名字:
album=[]
此时的列表是空的,我们随便放点东西进去,这样就创建了一个非空的列表:
album=['Black Star','David Bowie',25,True]
这个列表中所有的元素是我们一开始放好的,那当列表创建完成后,想再次往里面添加内容怎么办?使用列表的append方法可以向列表中添加新的元素,并且使用这种方式添加的元素会自动地排列到列表的尾部:
album.append('new song')
接着就是列表的索引,如果在前面的章节你很好的掌握了字符串的索引,相信理解新的知识应该不难。下面代码的功能是打印列表中第一个和左后一个元素:
print(album[0],album[-1])
接下来我们使用in来测试字符串'Black Star'是否在列表album中。如果存在则会显示True。不存在就会显示False了:
'Black Star' in album
是不是很简单?正如前面看到的那样,in后面是一个集合形态的对象,字符串满足这种集合的特性,所以可以使用in来进行测试。
接下来再来讲解is和is not,它们是表示身份鉴别的布尔运算符,in和not in则是表示归属关系的布尔运算符号。
在Python中任何一个对象都要满足身份(Identity)、类型(Type)、值(Value)这三个点,缺一不可。is操作符号就是来进行身份对比的。试试输入这段代码:
the_Eddie = 'Eddie'
name = 'Eddie'
the_Eddie == name
the_Eddie is name
你会发现在这两个变量一致时,经过is对比后会返回True。
其实在Python中任何对象都可以判断其布尔值,除了0、None和所有空的序列与集合(列表,字典,集合)布尔值为False之外,其它的都为True,我们可以使用函数bool()进行判别:
bool(0) #False
bool([]) #False
bool('') #False
bool(False) #False
bool(None) #False
当你想设定一个变量,但又没想好它应该等于什么值时,你就可以这样:
a_thing = None
布尔运算符
and,or用于布尔值之间的运算,具体规则如下:
and和or经常用于处理复合条件,类似于1<n<3,也就是两个条件同时满足。
1 < 3 and 2 < 5 #True
1 < 3 and 2 > 5 #False
1 < 3 or 2 > 5 #True
1 > 3 or 2 > 5 #False
条件控制
条件控制其实就是if...else的使用。先来看下条件控制的基本结构:
用一句话概括if...else结构的作用:如果...条件是成立的,就做...反之,就做...
所谓条件指的是成立的条件,即是返回值为True的布尔表达式。知道了这点后使用起来应该不难。
我们结合函数的概念来创建这样一个函数,逐行分析它的原理:
第1行:定义函数,并不需要参数;
第2行:使用input获得用户输入的字符串并储存在变量password中;
第3、4行:设置条件,如果用户输入的字符串和预设的密码12345相等时,就执行打印文本'Login success!';
第5、6行:反之,一切不等于预设密码的输入结果,全部会执行打印错误提示,并且再次调用函数,让用户再次输入密码;
第7行:运行函数。
第8行:调用函数
值得一提的是,如果if后面的布尔表达式过长或者难于理解,可以采取给变量赋值的办法来储存布尔表达式返回的布尔值True或False。因此上面的代码可以写成这样:
一般情况下,设计程序的时候需要考虑到逻辑的完备性,以及可能会对用户造成困扰的情况进行预防性设计,这时候就会有多条件判断。
多条件判断同样很简单,只需在if和else之间增加上elif,用法和if是一致的。
而且条件的判断也是依次进行的,首先看条件是否成立,如果成立就运行下面的代码,如果不成立就接着顺次地看下面的条件是否成立...如果都不成立则运行else对应的语句。
接下来我们使用elif语句来给刚才设计的函数增加一个重置密码的功能:
第1行:创建一个列表,用于储存用户的密码、初始密码和其他数据(对实际数据库的简化模拟);
第2行:定义函数;
第3行:使用input获得用户输入的字符串并储存在变量password中;
第4行:当用户输入的密码等于密码列表中最后一个元素的时候(即用户最新设定的密码),登录成功;
第5~9行:当用户输入的密码等于密码列表中第一个元素的时候(即重置密码的“口令”)触发密码变更,并将变更后的密码储存至列表的最后一个,成为最新的用户密码;
第10行:反之,一切不等于预设密码的输入结果,全部会执行打印错误提示,并且再次调用函数,让用户再次输入密码;
第11行:调用函数。
在上面的代码中其实可以清晰地看见代码块。代码块的产生是由于缩进,也就是说,具有相同缩进量的代码实际上是在共同完成相同层面的事情,这有点像是编辑文档时不同层级的任务列表。
至此,Python变量、字符串、函数、逻辑控制已经介绍完了。下一篇将介绍Python循环,列表,字典,元组,集合,map,filter,lambda表达式,第三方库。欢迎关注。