关于数据科学在作什么,咱们已经在前两篇文章中进行了总结,即专题概述和描述性统计分析。要进行数据科学的探索,须要一个“好工具”,就是Python
。从本篇开始,将总结学习Python
的学习要点。python
官方对 Python 的介绍以下:正则表达式
“Python 是一款易于学习且功能强大的编程语言。 它具备高效率的数据结构,可以简单又有效地实现面向对象编程。Python 简洁的语法与动态输入之特性,加之其解释性语言的本质,使得它成为一种在多种领域与绝大多数平台都能进行脚本编写与应用快速开发工做的理想语言。”
Python 名字的由来:编程
“Python 的创造者吉多·范罗苏姆(Guido van Rossum)采用 BBC 电视节目《蒙提·派森的飞行马戏团(Monty Python's Flying Circus,一译巨蟒剧团)》的名字来为这门编程语言命名。尽管他本人并不特别喜欢蟒蛇这种经过在猎物身边卷曲本身的身体以此来碾碎猎物身体来进食的动物。”
字面常量(Literal Constants)是诸如 五、1.23 这样的数字,或者是如“这是一串文本”或“This is a string”这样的文本。它们是字面上的,所用的就是它字面意义上的值或是内容。segmentfault
数字主要分为两种类型——整数(Integers)与浮点数(Floats)。如 2 和 3.23 或 52.3E-4,其中 E 表示 10 的幂。数组
字符串(String)是字符(Characters)的序列(Sequence)。字符串是不可变的。数据结构
格式化方法
一个字符串可使用某些特定的格式(Specification),随后,format 方法
将被调用,使用这一方法中与之相应的参数替换这些格式。即将每一个参数值替换至格式所在的位置。举例以下:编程语言
age = 14 name = 'Tom' print('{0} is a {1} years old boy'.format(name, age)) print('{0} is a good boy'.format(name))”
此外,能够指定更详细的格式:函数
# 对于浮点数 '0.333' 保留小数点(.)后三位 print('{0:.3f}'.format(1.0/3)) # 使用下划线填充文本,并保持文字处于中间位置 # 使用 (^) 定义 '___hello___'字符串长度为 11 print('{0:_^11}'.format('hello')) # 基于关键词输出 'Jack was confirmed as captain for the rest of the season' print('{name} was confirmed as {position} for the rest of the season'.format(name='Jack', position='captain'))
每次调用print
将在独立的一行中打印,即老是以换行符\n
结尾,如有时需避免这一换行符,能够end
指定其结尾方式。例如以空白结尾:工具
print('a', end=' ') print('b', end=' ') print('c')
输出a b c
.学习
转义序列
要输入如What's your name?
这样的字符串有两种方式。一种是使用双引号"What's your name?"
,另外一种须要用到反斜杠\
来指定单引号'What\'s your name?'
。其它须要转义的字符同理,经过反斜杠\
来转义,包括它自身。
原始字符串
在处理正则表达式时,应全程使用原始字符串,即在字符串前增长r
或R
来指定一个原始字符串。如'\\1'
能够经过'r\1'
来实现。
变量的值是能够变化的,便可以用变量储存任何东西,只需经过一些方式访问这些变量。
标识符(Identifiers)是为某些东西提供的给定名称。变量是标识符的一个例子。命名规则以下:
变量能够将各类形式的值保存为不一样的数据类型(Data Type)。基本的类型是数字
与字符串
,在面向对象编程中将介绍如何经过类
来建立咱们本身的类型。
Python 是强(Strongly)面向对象的,由于全部的一切都是对象, 包括数字、字符串与函数。
运算符
+
-
*
**
/
//
%
<<
>>
&
|
^
~
<
>
<=
>=
==
!=
not
and
or
表达式
在下面的例子中:
length = 5 breadth = 2 area = length * breadth print('Area is', area) print('Perimeter is', 2 * (length + breadth))
咱们将表达式 length * breadth
的结果存储在变量 area
中并将其经过使用 print
函数打印出来。在第二种状况中,咱们直接在 print
函数中使用了表达式 2 * (length + breadth)
的值。
在 Python 中有三种控制流语句,if
、for
和while
。
条件
if age >= 18:
注意不要少写了冒号:。
elif
是else if
的缩写,彻底能够有多个elif
,因此if
语句的完整形式就是:
if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> else: <执行4>
if
语句执行有个特色,它是从上往下判断,若是在某个判断上是True
,把该判断对应的语句执行后,就忽略掉剩下的elif
和else
。
if
判断条件还能够简写,好比写:
if x: print('True')
只要x
是非零数值、非空字符串、非空list
等,就判断为True
,不然为False
。
循环
Python 的循环有两种。
第一种是for...in循
环,依次把list
或tuple中
的每一个元素迭代出来
因此for x in ...
循环就是把每一个元素代入变量x
,而后执行缩进块的语句。
Python 提供一个range()
函数,能够生成一个整数序列,再经过list()
函数能够转换为list
。好比range(5)
生成的序列是从 0 开始小于 5 的整数:
计算:
第二种循环是while
循环:
在循环中,break
语句能够提早退出循环。
在循环过程当中,也能够经过continue
语句,跳过当前的此次循环,直接开始下一次循环。continue
的做用是提早结束本轮循环,并直接开始下一轮循环。
要特别注意,不要滥用break
和continue
语句。break
和continue
会形成代码执行逻辑分叉过多,容易出错。大多数循环并不须要用到break
和continue
语句,上面的两个例子,均可以经过改写循环条件或者修改循环逻辑,去掉break
和continue
语句。
有些时候,若是代码写得有问题,会让程序陷入“死循环”,也就是永远循环下去。这时能够用Ctrl+C
退出程序,或者强制结束 Python进程。
函数(Functions)是指可重复使用的程序片断。它们容许你为某个代码块赋予名字,容许你经过这一特殊的名字在你的程序任何地方来运行代码块,并可重复任何次数。这就是所谓的调用(Calling)函数。
在 Python 中,函数能够经过关键字 def
来定义。这一关键字后跟一个函数的标识符名称,再跟一对圆括号,其中能够包括一些变量的名称,再以冒号结尾,结束这一行。随后而来的语句块是函数的一部分。
在定义函数时给定的名称称做“形参”(Parameters),在调用函数时你所提供给函数的值称做“实参”(Arguments)。
要调用一个函数,须要知道函数的名称和参数。函数的参数只是输入到函数之中,以便咱们能够传递不一样的值给它,并得到相应的结果。
Python 内置的经常使用函数包括数据类型转换函数,好比int()
函数能够把其余数据类型转换为整数。用input()
读取用户的输入:
由于input()
返回的数据类型是str
,str
不能直接和整数比较,必须先把str
转换成整数。Python 提供了int()
函数来完成这件事情:
函数名其实就是指向一个函数对象的引用,彻底能够把函数名赋给一个变量,至关于给这个函数起了一个“别名”:
若是函数调用出错,必定要学会看错误信息。
在 Python 中,定义一个函数要使用def
语句,依次写出函数名、括号、括号中的参数和冒号:
,而后,在缩进块中编写函数体,函数的返回值用return
语句返回。
在 Python 交互环境中定义函数时,注意 Python 会出现...
的提示。函数定义结束后须要按两次回车从新回到>>>
提示符下:
若是你已经把my_abs()
的函数定义保存为abstest.py
文件了,那么,能够在该文件的当前目录下启动Python 解释器,用from abstest import my_abs
来导入my_abs()
函数,注意abstest
是文件名(不含.py扩展名)。
定义一个什么事也不作的空函数,能够用pass
语句:
def nop(): pass
pass
语句什么都不作,实际上它能够用做为占位符,好比如今还没想好怎么写函数的代码,就能够先放一个pass
,让代码能运行起来。
pass
还能够用在其余语句里,好比:
if age >= 18: pass
缺乏了pass
,代码运行就会有语法错误。
数据类型检查能够用内置函数isinstance()
实现。
Python 的函数返回多值其实就是返回一个tuple
;Python 函数返回的是单一值时,返回值仍然是一个tuple。可是,在语法上,返回一个tuple
能够省略括号,而多个变量能够同时接收一个tuple
,按位置赋给对应的值。函数能够同时返回多个值,但其实就是一个tuple
。
函数执行完毕也没有return
语句时,自动return None
。
Python 的函数定义很是简单,但灵活度却很是大。除了正常定义的必选参数
外,还可使用默认参数
、可变参数
和关键字参数
,使得函数定义出来的接口,不但能处理复杂的参数,还能够简化调用者的代码。
位置参数:
power(x, n)
函数有两个参数:x
和n
,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x
和n
。
默认参数:
对于一些函数来讲,你可能为但愿使一些参数可选并使用默认的值,以免用户不想为他们提供值的状况。默认参数值能够有效帮助解决这一状况。你能够经过在函数定义时附加一个赋值运算符=
来为参数指定默认参数值。要注意到,默认参数值应该是常数。更确切地说,默认参数值应该是不可变的。
n = 2
是默认参数
定义默认参数要牢记一点:默认参数必须指向不变对象。且只有那些位于参数列表末尾的参数才能被赋予默认参数值,意即在函数的参数列表中拥有默认参数值的参数不能位于没有默认参数值的参数以前。
可变参数:
有时你可能想定义的函数里面可以有任意数量的变量,也就是参数数量是可变的,这能够经过使用星号来实现。即传入的参数个数是可变的。
咱们声明一个诸如 *param
的星号参数时,今后处开始直到结束的全部位置参数(Positional Arguments)都将被收集并聚集成一个称为param
的元组(Tuple)。
相似地,当咱们声明一个诸如 **param
的双星号参数时,今后处开始直至结束的全部关键字参数都将被收集并聚集成一个名为 param
的字典(Dictionary)
。
关键字参数:
若是你有一些具备许多参数的函数,而你又但愿只对其中的一些进行指定,那么你能够经过命名它们来给这些参数赋值——这就是关键字参数(Keyword Arguments)——咱们使用命名(关键字)而非位置来指定函数中的参数。
关键字参数容许你传入 0 个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
。
举个例子,扩展函数的功能。试想你正在作一个用户注册的功能,除了用户名和年龄是必填项外,其余都是可选项,利用关键字参数来定义这个函数就能知足注册的需求。
和可变参数相似,也能够先组装出一个dict
,而后,把该dict
转换为关键字参数传进去:
命名关键字参数:
若是要限制关键字参数的名字,就能够用命名关键字参数,例如,只接收city
和job
做为关键字参数。这种方式定义函数并调用:
和关键字参数**kw
不一样,命名关键字参数须要一个特殊分隔符*
,*
后面的参数被视为命名关键字参数。
命名关键字参数必须传入参数名,这和位置参数不一样。若是没有传入参数名,调用将报错。
使用命名关键字参数时,要特别注意,若是没有可变参数,就必须加一个*
做为特殊分隔符。若是缺乏*,Python 解释器将没法识别位置参数和命名关键字参数,即缺乏 *
,city
和job
被视为位置参数。
参数组合:
在 Python 中定义函数,能够用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这 5 种参数均可以组合使用。
可是参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。虽然能够组合多达 5 种参数,但不要同时使用太多的组合,不然函数接口的可理解性不好。
经过一个tuple
和dict
,你也能够调用函数:
对于任意函数,均可以经过相似func(*args, **kw)
的形式调用它,不管它的参数是如何定义的。
若是一个函数在内部调用自身自己,这个函数就是递归函数。理论上,全部的递归函数均可以写成循环的方式,但循环的逻辑不如递归清晰。
使用递归函数须要注意防止栈溢出。在计算机中,函数调用是经过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。因为栈的大小不是无限的,因此,递归调用的次数过多,会致使栈溢出。
经过下面的代码能够查看你的电脑最大算到多少:
解决递归调用栈溢出的方法是经过尾递归优化,事实上尾递归和循环的效果是同样的,因此,把循环当作是一种特殊的尾递归函数也是能够的。
尾递归是指,在函数返回的时候,调用自身自己,而且,return
语句不能包含表达式。这样,编译器或者解释器就能够把尾递归作优化,使递归自己不管调用多少次,都只占用一个栈帧,不会出现栈溢出的状况。
要改为尾递归方式,须要多一点代码,主要是要把每一步的乘积传入到递归函数中。Python 标准的解释器没有针对尾递归作优化,任何递归函数都存在栈溢出的问题。
参考连接:
简明Python教程(电子书可阅读)
廖雪峰Python教程
若有不足,欢迎指正。