【数据科学系统学习】Python # 编程基础[一]

关于数据科学在作什么,咱们已经在前两篇文章中进行了总结,即专题概述描述性统计分析。要进行数据科学的探索,须要一个“好工具”,就是Python。从本篇开始,将总结学习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?'。其它须要转义的字符同理,经过反斜杠\来转义,包括它自身。

原始字符串
在处理正则表达式时,应全程使用原始字符串,即在字符串前增长rR来指定一个原始字符串。如'\\1'能够经过'r\1'来实现。

变量

变量的值是能够变化的,便可以用变量储存任何东西,只需经过一些方式访问这些变量。

标识符命名

标识符(Identifiers)是为某些东西提供的给定名称。变量是标识符的一个例子。命名规则以下:

  • 第一个字符必须是字母表中的字母(大写 ASCII 字符或小写 ASCII 字符或 Unicode 字符)或下划线(_)。
  • 标识符的其它部分能够由字符(大写 ASCII 字符或小写 ASCII 字符或 Unicode 字符)、下划线(_)、数字(0~9)组成。
  • 标识符名称区分大小写。

数据类型

变量能够将各类形式的值保存为不一样的数据类型(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 中有三种控制流语句,ifforwhile

条件

if age >= 18:

注意不要少写了冒号:。

elifelse if的缩写,彻底能够有多个elif,因此if语句的完整形式就是:

if <条件判断1>:
    <执行1>
elif <条件判断2>:
    <执行2>
elif <条件判断3>:
    <执行3>
else:
    <执行4>

if语句执行有个特色,它是从上往下判断,若是在某个判断上是True,把该判断对应的语句执行后,就忽略掉剩下的elifelse

if判断条件还能够简写,好比写:

if x:
    print('True')

只要x是非零数值、非空字符串、非空list等,就判断为True,不然为False

循环
Python 的循环有两种。

第一种是for...in循环,依次把listtuple中的每一个元素迭代出来

因此for x in ...循环就是把每一个元素代入变量x,而后执行缩进块的语句。

Python 提供一个range()函数,能够生成一个整数序列,再经过list()函数能够转换为list。好比range(5)生成的序列是从 0 开始小于 5 的整数:
图片描述

计算:
图片描述

第二种循环是while循环:
图片描述

在循环中,break语句能够提早退出循环。
图片描述

在循环过程当中,也能够经过continue语句,跳过当前的此次循环,直接开始下一次循环。continue的做用是提早结束本轮循环,并直接开始下一轮循环。
图片描述

要特别注意,不要滥用breakcontinue语句。breakcontinue会形成代码执行逻辑分叉过多,容易出错。大多数循环并不须要用到breakcontinue语句,上面的两个例子,均可以经过改写循环条件或者修改循环逻辑,去掉breakcontinue语句。

有些时候,若是代码写得有问题,会让程序陷入“死循环”,也就是永远循环下去。这时能够用Ctrl+C退出程序,或者强制结束 Python进程。

函数

函数是什么

函数(Functions)是指可重复使用的程序片断。它们容许你为某个代码块赋予名字,容许你经过这一特殊的名字在你的程序任何地方来运行代码块,并可重复任何次数。这就是所谓的调用(Calling)函数。

在 Python 中,函数能够经过关键字 def 来定义。这一关键字后跟一个函数的标识符名称,再跟一对圆括号,其中能够包括一些变量的名称,再以冒号结尾,结束这一行。随后而来的语句块是函数的一部分。

在定义函数时给定的名称称做“形参”(Parameters),在调用函数时你所提供给函数的值称做“实参”(Arguments)。

调用函数

要调用一个函数,须要知道函数的名称和参数。函数的参数只是输入到函数之中,以便咱们能够传递不一样的值给它,并得到相应的结果。

Python 内置的经常使用函数包括数据类型转换函数,好比int()函数能够把其余数据类型转换为整数。用input()读取用户的输入:
clipboard.png

由于input()返回的数据类型是strstr不能直接和整数比较,必须先把str转换成整数。Python 提供了int()函数来完成这件事情:
clipboard.png

函数名其实就是指向一个函数对象的引用,彻底能够把函数名赋给一个变量,至关于给这个函数起了一个“别名”:
clipboard.png

若是函数调用出错,必定要学会看错误信息。

定义函数

在 Python 中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,而后,在缩进块中编写函数体,函数的返回值用return语句返回。

在 Python 交互环境中定义函数时,注意 Python 会出现...的提示。函数定义结束后须要按两次回车从新回到>>>提示符下:
clipboard.png

若是你已经把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 的函数定义很是简单,但灵活度却很是大。除了正常定义的必选参数外,还可使用默认参数可变参数关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还能够简化调用者的代码。

位置参数:
clipboard.png

power(x, n)函数有两个参数:xn,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数xn

默认参数:
对于一些函数来讲,你可能为但愿使一些参数可选并使用默认的值,以免用户不想为他们提供值的状况。默认参数值能够有效帮助解决这一状况。你能够经过在函数定义时附加一个赋值运算符=来为参数指定默认参数值。要注意到,默认参数值应该是常数。更确切地说,默认参数值应该是不可变的。

clipboard.png

n = 2 是默认参数

定义默认参数要牢记一点:默认参数必须指向不变对象。且只有那些位于参数列表末尾的参数才能被赋予默认参数值,意即在函数的参数列表中拥有默认参数值的参数不能位于没有默认参数值的参数以前。
 

可变参数:
有时你可能想定义的函数里面可以有任意数量的变量,也就是参数数量是可变的,这能够经过使用星号来实现。即传入的参数个数是可变的。

clipboard.png
clipboard.png

咱们声明一个诸如 *param 的星号参数时,今后处开始直到结束的全部位置参数(Positional Arguments)都将被收集并聚集成一个称为param的元组(Tuple)。

相似地,当咱们声明一个诸如 **param 的双星号参数时,今后处开始直至结束的全部关键字参数都将被收集并聚集成一个名为 param字典(Dictionary)

关键字参数:
若是你有一些具备许多参数的函数,而你又但愿只对其中的一些进行指定,那么你能够经过命名它们来给这些参数赋值——这就是关键字参数(Keyword Arguments)——咱们使用命名(关键字)而非位置来指定函数中的参数。

关键字参数容许你传入 0 个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

举个例子,扩展函数的功能。试想你正在作一个用户注册的功能,除了用户名和年龄是必填项外,其余都是可选项,利用关键字参数来定义这个函数就能知足注册的需求。
clipboard.png

和可变参数相似,也能够先组装出一个dict,而后,把该dict转换为关键字参数传进去:
clipboard.png

命名关键字参数:
若是要限制关键字参数的名字,就能够用命名关键字参数,例如,只接收cityjob做为关键字参数。这种方式定义函数并调用:
clipboard.png

和关键字参数**kw不一样,命名关键字参数须要一个特殊分隔符**后面的参数被视为命名关键字参数。

命名关键字参数必须传入参数名,这和位置参数不一样。若是没有传入参数名,调用将报错。

使用命名关键字参数时,要特别注意,若是没有可变参数,就必须加一个*做为特殊分隔符。若是缺乏*,Python 解释器将没法识别位置参数和命名关键字参数,即缺乏 *cityjob被视为位置参数。

clipboard.png

参数组合:
在 Python 中定义函数,能够用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这 5 种参数均可以组合使用。

可是参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。虽然能够组合多达 5 种参数,但不要同时使用太多的组合,不然函数接口的可理解性不好。

经过一个tupledict,你也能够调用函数:
clipboard.png

对于任意函数,均可以经过相似func(*args, **kw)的形式调用它,不管它的参数是如何定义的。

递归函数

若是一个函数在内部调用自身自己,这个函数就是递归函数。理论上,全部的递归函数均可以写成循环的方式,但循环的逻辑不如递归清晰。

使用递归函数须要注意防止栈溢出。在计算机中,函数调用是经过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。因为栈的大小不是无限的,因此,递归调用的次数过多,会致使栈溢出。

经过下面的代码能够查看你的电脑最大算到多少:
clipboard.png

解决递归调用栈溢出的方法是经过尾递归优化,事实上尾递归和循环的效果是同样的,因此,把循环当作是一种特殊的尾递归函数也是能够的。

尾递归是指,在函数返回的时候,调用自身自己,而且,return语句不能包含表达式。这样,编译器或者解释器就能够把尾递归作优化,使递归自己不管调用多少次,都只占用一个栈帧,不会出现栈溢出的状况。

要改为尾递归方式,须要多一点代码,主要是要把每一步的乘积传入到递归函数中。Python 标准的解释器没有针对尾递归作优化,任何递归函数都存在栈溢出的问题。

clipboard.png


参考连接:
简明Python教程(电子书可阅读)
廖雪峰Python教程

若有不足,欢迎指正。

相关文章
相关标签/搜索