一、从计算机到Python
1.计算机与程序思维
计算机最核心的三个部分为CPU、内存和硬盘,都在主板上面,除此之外,还包括键盘、鼠标等输入设备和屏幕等输出设备,如下:
CPU用于进行计算,硬盘用于存储数据和文件,内存(包括缓存)用于连接CPU和硬盘,作为两者的缓冲,可以加快读取和处理速率。
冯·诺依曼架构如下:
程序是指定如何执行计算的一系列指令,可以说,程序就是写给计算机的菜谱,计算机通过输入逐行读取命令并执行,有输出则输出结果。
但是程序思维和普通思维不太一样,比如:
对于一个陈述性知识(Declarative Knowledge)y是x的平方根,当且仅当y*y=x
,但是对于程序性知识(lmperative Knowledge)可能就不是这么表现的,可能如下:
很明显,两种思维是有很大区别的。 在人的语言中,很多语句存在歧义,计算机不一定能理解,因此需要专门的编程语言。
有一个典型的笑话:
老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。” 当晚,程序员老公手捧一个包子进了家门。。。 老婆怒道:“你怎么就买了一个包子?!” 老公答曰:“因为看到了卖西瓜的。”
这虽然是一个笑话,但是也说明计算机语言需要精确的表达,如果存在歧义就可能会出现不一样的结果。
程序员在码代码时经常会思考两个问题: (1)It doesn't work,...,why? (2)It works,...,why? 这也是程序员很正常的状态。
程序员发展道路可以如下:
- 学习基本语法
- 读别人的代码
- 修改别人的代码
- 开始写自己的小程序
- 参与开源项目
写程序应该遵循以下步骤:
- 问题表述 有什么,要实现什么。
- 设计计划 如何实现,需要什么。
- 编码与调试 编码与错误验证。
- 评价 评价是否合理。
- 改进(重构) 优化或重新编写。
编程语言的元素如下:
- 词汇 变量Variables和保留词汇Reserved words。 Python中的保留词汇包括FALSE、class、is、finally、return、None、if、for、lambda、continue、True、def、from、while、nonlocal、and、del、global、with、not、elif、yield、try、as、or、else、assert、import、pass、break、in、raise、except等。
- 句子结构
- 语法Syntax
- 语义Semantics
- 程序结构 为某个目的构造程序。
程序中的基本指令包括:
- input数据输入 从键盘、文件或其他设备获取数据。
- output输出 在屏幕上显示数据或将数据发送到文件或其他设备。
- math计算 执行基本的数学运算,如加法和乘法。
- conditional execution条件执行 检查某些情况并执行适当的代码。
- repetition重复 重复地做一些动作,通常有一些变化。
其中,后两者用于控制逻辑。
程序中常见的基本数据类型如下:
- Integer整型
- 3、100等整数。
- Float浮点型 带小数点的数字,如3.14159,或某些指数,如1.0e8或10000.0。
- Boolean布尔型 其值为True或False。
- String字符串
文本字符序列。
2.Python的特点和应用
Python是一门计算机程序语言,可以理解为人对计算机的指令。
Python之所以这么火,与它的特点有关:
- 简洁美观
- 广泛的第三方库支持 很多人基于Python开发出现成的功能,别人可以直接使用,并且体系逐渐完善,使用起来越来越方便。
- 支持大多数现代云平台
- 最新机器学习框架
Python的典型应用包括数据分析、软件开发两大领域: Python中有很多库支持数据分析,包括numpy、pandas、scipy、matplotlib、networkx等; 支持软件开发的库包括Django、Flask和Pyramid等,包括Dropbox、Youtube、Instagram、豆瓣、知乎、魔兽世界等网站和应用都是完全或部分使用Python实现的。
虽然对于视频流、3D游戏等应用,Python还是存在一定的局限,但是它的确有着广泛的应用,所以在IT领域的各个子领域可以使用Python这同一门语言。 Python比较年轻,但是发展迅速,并且从2010年以后由于数据分析等应用得到了快速发展。 同时由于其开源免费,相比于SAS等其他语言,能够更容易被使用者接受,进一步扩大了其应用。
为什么会选择Python作为入门和开发语言:
- 易学
- 简单与可读性
- 包支持
- 更快
- 处理大数据
3.工具选择和安装
Python存在Python2和Python3两个版本,现在Python2已经停止更新,Python3已逐渐成为主流。 Python最常用的IDE(集成开发环境,lntegrated Development Environment)是PyCharm,但是只有专业版(付费)才支持科学计算和数据分析,社区版(免费)不支持科学计算,因此进行数据分析和科学计算还有其他选择,这里选择专业的科学分析工具集Anaconda,并且选择Python3版本。
由于在官网中下载较慢,因此我已经将Anaconda安装包下载整理好了,可以直接点击加QQ群 963624318 在群文件夹Python相关安装包中下载即可。
安装和普通软件安装类似,直接点下一步即可,只是需要注意,在选择是否添加环境变量时需要勾选,这样就可以直接在命令行中执行相关命令,在Anaconda安装好之后,Python也自动安装,并且安装了科学计算一般所需要的库,不需要自己再专门安装。
安装好之后,按WIN
键可以看到,应用列表中有Anaconda包含的工具集合,如下:
对于编写代码,有三个层次的工具:
Editor 代码编辑器,包括交互式的编程环境Text、Sublime Text、Notepad++、VSCode等。 编辑器可以编写代码,但是一般不能独立运行代码。
IDE 集成开发环境,即lntegrated Development Environment,如PyCharm。 IDE不仅可以编写代码,还可以运行代码,同时还提供代码高亮、调试、代码上传、版本控制等复杂功能,更适合开发大型工程。
REPL 全称
Read-Evalulate-Print Loop
,即读取-求值-输出循环,也就是交互式的编程环境,如Jupyter Notebook。 其特点如下: (1)优点笔记本形式
良好的实验环境
方便生成报告
免费
(2)缺点
不便于版本控制
文件组织形式凌乱
4.Jupyter Notebook的基本使用
点击WIN
键并按下图操作:
会弹出一个窗口,接下来按下面示意操作即可打开jupyter notebook:
可以看到,打开后是一个命令行,所在的目录在系统家目录下,我们一般需要在自己的工作目录下读取和保存文件,因此可以通过输入cd XXX
(XXX为自己所需要执行的目录,在资源管理器中复制即可)跳转到所需目录;
打开notebook是通过输入jupyter notebook
命令实现的,执行完后,会使用电脑的默认浏览器打开一个网页界面,所有的操作都在这个网页中进行,会读取当前工作目录中的所有文件,资源管理器中对文件的操作都会同步到notebook中;
如果想要在其他浏览器打开,只需要复制URL到浏览器中访问即可。
基础操作如下:
也可以新建notebook文件,示意如下:
可以看到,可以对新建的文件进行命名,同时在文件夹中也可以看到新创建的文件First Python.ipynb;
一个Input或Output框称为一个Cell,Cell中可以执行代码,输入完毕之后按CTRL+Enter
即可执行代码,还可以按Shift+ENter
允许当前Cell并自动跳转到下一个Cell;
Cell左边的[]
中的数字表示运行的顺序,先运行的数字较小,后运行的数字较大,如果是*
则表示仍在运行、还未结束,此时也不能继续执行其他cell中的代码。
还有进一步操作:
可以看到,Cell可以方便地添加、删除或者在指定位置插入;
同时Cell中也可以选择类型,除了代码还可以是Markdown和标题等,也是按CTRL+Enter
即可显示有样式的文本,并且支持多种类型混合。
二、Python的简单使用
1.print函数的使用
学习一门新的语言就像打开一个新的世界,计算机输出hello world
就是在向世界打招呼,输入:
print("Hello World! 你好,世界! Hola mundo!")
输出:
Hello World! 你好,世界! Hola mundo!
如需本节同步
ipynb
文件,可以直接点击加QQ群 963624318 在群文件夹商业数据分析从入门到入职中下载即可。
输入:
print("Hello World!")
print("Hello Again")
print("This is the 3rd line, \n","and this is also the 3rd line.")
print("This is the 3rd line, \
and this is also the 3rd line.")
输出:
Hello World!
Hello Again
This is the 3rd line,
and this is also the 3rd line.
This is the 3rd line, and this is also the 3rd line.
可以看到:
\n
表示换行,后面的内容会换行输出;
\
可以将一行字符串换行输入,但是实际上还是一行。
2.notebook中进行计算
notebook最主要的功能就是进行计算和数据分析。 输入:
4+5
输出:
9
再如:
print(4-5)
print(4*5)
输出:
-1
20
如果代码中存在错误会抛出异常,例如:
print(8 + )
输出:
File "<ipython-input-6-74de9a467743>", line 1
print(8 + )
^
SyntaxError: invalid syntax
显然,没有输出结果,反而提示语法错误; 需要满足运算的条件才能正常运行。
但是下面就不会报错:
print('8+')
打印:
8+
这是因为将其放入单引号''
或双引号""
中,使之成为字符串,字符串是可以打印的。
再如:
110/12.97
输出:
8.481110254433307
但是输出时,最后一次操作的结果将自动打印出来,前面的代码会执行但是不输出。 如下:
111*222
333*444
输出:
147852
此时指输出了333*444
的结果,并未输出111*222
的结果,此时要输出该结果,只需要使用print()
函数即可,如下:
print(111*222)
print(333*444)
输出:
24642
147852
此时可以全部输出。
除此之外,也可以使用display()
函数,如下:
display(111*222, 333*444)
输出:
24642
147852
3.Python基本语法规范
编程都应该遵循一定的代码规范,这样既可以美化代码,也可以让别人更加直观地阅读代码、不至于不理解或产生误会。 Python也一样,有自己的规范,即为PEP8(Python Enhancement Proposal 8,Python8号增强方案),规定了优雅的Python代码应该具有的格式。
=
是赋值运算符,如下:
number_of_cars = 34
即是将34赋值给变量number_of_cars,以后number_of_cars即代表数值34。
Python中,有时候空格是有意义的,一般代码用4个空格或者制表符Tab进行缩进、控制代码结构。 如下:
x = 8
if x < 7:
print(x)
会报错:
File "<ipython-input-13-29d07b2c12b7>", line 4
print(x)
^
IndentationError: expected an indented block
修改为如下就不会报错:
x = 8
if x < 7:
print(x)
同时需要注意语义上的问题,避免出现语意和逻辑上的错误。 如下:
x=8
if x < 7:
print("x is smaller than 7")
print("x is bigger than 7")
显然,这虽然不会报错,但是在语义上是有问题的。
在Python中,一切都是作为对象实现的: 我们可以将一个对象看作一个包含一段数据的盒子; 对象的类型决定了可以对对象(数据)执行的操作,例如,数字可以进行四则运算。
在赋值运算符左侧的为变量,右侧的是值,右侧也可以是变量。 如下:
speed_of_liuxiang=110/12.97
distance= 1000
time = distance/speed_of_liuxiang
print(time)
print(time/60)
输出:
117.9090909090909
1.965151515151515
其中,110/12.97
是值,speed_of_liuxiang
是变量,通过赋值运算符=
实现将右侧的值赋值给左侧,这也是我们在Python中定义变量的方式;
但是,在Python中变量只是名称,赋值不复制值,它只是将一个名称附加到包含数据的对象上,可以把变量理解为贴到对象上的标签,如下:
对象在盒子中,盒子上的标签就是变量,可以引用到对象。
三、Python基本数值数据类型
Python中有4种内置数值数据类型:
- 整型int
- 浮点型float
- 布尔型bool
- 字符串str
1.整型
整型即整数。
输入:
123
输出:
123
但是输入05
,会报错:
File "<ipython-input-21-65e6e002a62d>", line 1
05
^
SyntaxError: leading zeros in decimal integer literals are not permitted; use an 0o prefix for octal integers
所以整型不能以0开头。
输入:
123,456,789
输出:
(123, 456, 789)
此时数据类型已经改变,不再是整型,而是元组。
整型的运算如下:
a = 5
a += 2
display(1 + 2, a, a-3,9//5,9/5,9%5,2+3*4)
输出:
3
7
4
1
1.8
4
14
其中,a += 2
是a = a + 2
的简写;
//
是地板除,即向下取整;
/
的结果是浮点型;
%
表示求模,即求相除的余数。
在Python3中,int可以处理任何整数,无论它有多大,都不会导致溢出。 如下:
a = 10**100
display(a, a*a)
输出:
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
可以看到,数足够大,但是并没有溢出;
**
表示幂运算。
还可以转化为其他进制:
display(10,0b10,0o10,0x10)
输出:
10
2
8
16
其中,无修饰默认为10进制,0b
修饰为二进制,0o
修饰为八进制,0x
为十六进制。
2.浮点型
浮点型即小数。
可以使用type(variable)
来获取变量的类型。例如,type(1)
返回int,type(1.2)
返回float。
输入:
a = 98.5
type(a)
输出:
float
也可以使用科学计数法,如输入9.8125e2
,输出981.25
。
Python提供了很多有用的数学函数,包括在math库中。
要使用它们,必须先通过命令import math
导入。
使用示意如下:
import math
display(math.pi, math.e, math.floor(98.6), math.ceil(98.6), math.pow(2, 3), 2**3, math.sqrt(25))
输出:
3.141592653589793
2.718281828459045
98
99
8.0
8
5.0
可以看到,math.pow()
方法得出的都是浮点型,而**
的结果需要根据参与运算的数值的类型。
3.布尔型
布尔型只有两个值,即True和False,表示逻辑判断的真假。
运算如下:
display(type(1 < 2), (2 < 1) or (1 < 2), not (2 < 1), (2 < 1) and (1 < 2), (2 == 1), (2 != 1))
输出:
bool
True
True
False
False
True
其中,or
表示或运算,not
表示非运算,and
表示且运算;
==
用于判断两个变量值是否相等,是逻辑运算符,需要注意与=
不同,它是赋值运算符。
4.字符串
字符串是Python中众多序列中的一个,它是一个字符序列。
输入:
s = 'this is a string'
display(type(s), "this is also a string", "I'm a string")
输出:
str
'this is also a string'
"I'm a string"
可以看到,字符串可以由单引号或者双引号包裹、并且需要成对出现,使用上两者没什么区别,但是两者可以实现嵌套,即双引号中可以用单引号,单引号中可以用双引号。
还可以在双引号中使用双引号,此时需要使用\
进行转义,如下:
s = "He said: \"I'm a string\""
print(s)
输出:
He said: "I'm a string"
可以看到,在双引号包含的字符串中也可以用双引号作为普通字符,这是通过转义实现的,转义即使需要转义的字符失去其特殊的意义、作为一个普通的字符。
转义字符还可以用于换行符等其他特殊字符,如下:
long_s = "You can put a long string that \ntakes up multiple lines here"
print(long_s)
输出:
You can put a long string that
takes up multiple lines here
用3层单引号或双引号即可实现字符串换行并保留原格式,如下;
s = '''
This is the first line
This is the second line
'''
print(s)
输出:
This is the first line
This is the second line
5.类型转换
不同的类型的数据之间可以进行类型转换。
浮点数转化为字符串如下:
a = str(98.6)
display(a,type(a))
输出:
'98.6'
str
再如:
display(str(True), float('98.6'), int('-123'))
输出:
'True'
98.6
-123
如果混合了不同的数值类型,Python将尝试进行转换再进行运算。 如下:
display(1 + 2.0, True + 3)
输出:
3.0
4
但是,一般不能将字符串与数字进行混合运算,除非操作有意义(字符串组合和重复); 同时,转化后的类型一般不能再进行转换之前所属类型的操作,如浮点数转换为字符串后,不能再进行数值运算。
如下:
3.88+"28"
输出:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-45-7c94633b599a> in <module>
----> 1 3.88+"28"
TypeError: unsupported operand type(s) for +: 'float' and 'str'
可以转化为相同的类型再进行计算:
print(int(3.88) + int("28"))
print(int(-2.95) + int("28"))
print(float(3) + float("28"))
print(str(3.88) + str(28))
输出:
31
26
31.0
3.8828
可以看到,字符串与字符串实际上是字符串的拼接。
四、字符串操作
1.结合与重复
字符串可以进行结合与重复操作。 结合即字符串的拼接,如下:
template = "My name is"
name = "Corley"
greeting = template + " " + name + "."
print(greeting)
输出:
My name is Corley.
重复是将一个字符串重复指定次数,如下:
laugh = 5 * "Ha "
print(laugh)
输出:
Ha Ha Ha Ha Ha
2.提取与切片
字符串还可以进行提取和切片。 如下:
letters = "abcdefghijklmnopqrstuvwxyz"
letters[0]
输出:
'a'
其中0是下标,下标即各位字符位置的数字表示,范围是0到length-1(length是字符串的长度)。
如果下标超出范围会报错,如下:
letters = "hello world"
letters[25]
报错:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-51-17d500830d0d> in <module>
1 letters = "hello world"
----> 2 letters[25]
IndexError: string index out of range
还可以用负数下标,如下:
letters[-2]
输出:
'l'
负数表示从后往前计数,范围是从-1到-length
。
使用slice从字符串中提取子字符串的方法是[start:end:step]
,有很多具体实现方式,以letters = "hello world"
为例进行说明:
方式|含义|举例输入|输出
-----|-----|-----|-----
[:] |提取整个字符串|letters[:]|'hello world'
[start:] |从start下标开始到结束|display(letters[2:],letters[-3:])|'llo world'\n'rld'
[:end] |从开始到end-1下标|display(letters[:5], letters[:100])|'hello'\n'hello world'
[start:end] |从start下标end-1下标|display(letters[2:5],letters[-6:-2],letters[-2:-6])|'llo'\n' wor'\n''
[start: end:step]|从start下标end-1下标,以step为间隔跳过字符|display(letters[1:5:2],letters[7:1:-2],letters[::7],letters[::-1])|'el'\n'o l'\n'ho'\n'dlrow olleh'
可以看到,在切片时,如果end参数超出下表范围,不会报错,而是直接切片到字符串尾;
如果start大于end,并且不指定step或step为正时,会取不到字符,返回空字符串,此时要想取到字符,需要使step为负数;
[::-1]
用于将字符串倒序排列。
3.获取长度
获取字符串长度使用len()
方法。
如下:
len(letters)
输出:
11
4.分割和合并
分割字符串使用split()
方法,如下:
lan = "python ruby c c++ swift"
lan.split()
输出:
['python', 'ruby', 'c', 'c++', 'swift']
可以看到,分割得到的结果是列表;
在没有给split()
传参数时,默认使用空格进行分割。
还可以指定分割字符(串),传入指定的字符(串)到split()
方法中即可按照指定的字符(串)进行切割,如下:
todos = "download python, install, download ide, learn"
todos.split(', ')
输出:
['download python', 'install', 'download ide', 'learn']
可以使用join()
方法拼接列表中的字符串成为一个新字符串。
如下:
','.join(['download python', 'install', 'download ide', 'learn'])
输出:
'download python,install,download ide,learn'
5.替换
调用replace()
方法进行字符串替换。
如下:
s = 'I like C. I like C++. She likes Python'
s.replace('like', 'hate')
输出:
'I hate C. I hate C++. She hates Python'
可以看到,所有like都被替换成hate。
还可以指定替换次数如下:
s.replace('like', 'hate', 2)
输出:
'I hate C. I hate C++. She likes Python'
显然,此时只替换了2次。
6.布局
字符串可以设置长度和对齐方式,如果字符串长度不够则用空格将前后补全。 如下:
align = 'Learn how to align'
display(align.center(30),align.ljust(30),align.rjust(30))
输出:
' Learn how to align '
'Learn how to align '
' Learn how to align'
可以看到,有居中、向左和向右对齐。
strip()
方法用于去掉字符串前后的空格,如下:
ralign = align.rjust(30)
ralign.strip()
输出:
'Learn how to align'
7.其他操作
对于字符串,还有很多其他使用的方法,以py_desc = "Python description: Python is a programming language that lets you work quickly and integrate systems more effectively."
为例进行简单说明:
方法|含义|输入|输出
-----|-----|-----|-----
startswith()|字符串是否以某个子串开头|py_desc.startswith('Python')|True
endswith()|字符串是否以某个子串结尾|py_desc.endswith('effectively')|False
find()|字符串中某个子串第一次出现的位置|py_desc.find('language')|44
isalnum()|字符串是否只包含字母和数字|py_desc.isalnum()|False
count()|字符串中某个子串出现的次数|py_desc.count("Python")|2
strip()|去掉字符串开头和结尾的某个字符|py_desc.strip('.')|'Python description: Python is a programming language that lets you work quickly and integrate systems more effectively'
upper()|将一个字符串转化成大写形式|py_desc.upper()|'PYTHON DESCRIPTION: PYTHON IS A PROGRAMMING LANGUAGE THAT LETS YOU WORK QUICKLY AND INTEGRATE SYSTEMS MORE EFFECTIVELY.'
title()|将一个字符串转化为标题的形式,即单词的首字母大写|py_desc.title()|'Python Description: Python Is A Programming Language That Lets You Work Quickly And Integrate Systems More Effectively.'
对于一个方法或函数,如果不知道含义和用法,可以输入?对象名.方法名或函数名
来查看帮助文档,例如输入:
?py_desc.title
在网页下方就会弹出一个窗口,用来解释str.title
的意义和用法:
Signature: py_desc.title()
Docstring:
Return a version of the string where each word is titlecased.
More specifically, words start with uppercased characters and all remaining
cased characters have lower case.
Type: builtin_function_or_method
除此之外,还可以查看Python官方文档,地址为https://docs.python.org/3/,在右上角搜索框中输入方法或函数的关键字即可查询到相关的含义和用法说明。
五、输入输出和字符串格式化
已经用到过很多次的print()
属于输出函数,除此之外还有输入函数,为input()
。
演示如下:
可以看到,执行后就会有输入框等待输入,直到输入后才会进行下一步动作;
其中,%s
表示格式化字符串,用来代替字符串,有3个%s
,所以后面有3个变量与之对应,将其填充到%s
所在的位置。
格式化字符串有很多方式,具体如下:
print('%s %s' % ('one', 'two'))
print('{} {}'.format('one', 'two'))
print('%d %d' % (1, 2))
print('{} {}'.format(1, 2))
输出:
one two
one two
1 2
1 2
使用format()
方法还可以控制字符串填入的顺序,如下:
print('{1} {0}'.format('one', 'two'))
输出:
two one
可以看到,与之前的效果不一样;
数字代表format()
方法中参数的位置,从0开始、逐渐增大。
format()
方法中还可以给参数传递名称,如下:
print('{action}---{name}'.format(action='run',name='corley'))
输出:
run---corley
Python3.6及之后的版本还提供了格式化字符串字面量的用法,即f-strings
,格式化字符串更加简便。
如下:
a = 5
b = 10
print(f'Five plus ten is {a + b} and not {2 * (a + b)}.')
输出:
Five plus ten is 15 and not 30.
此时{}
中的变量可以进行计算,而不是作为普通字符串。
再如:
name = "Corley"
question = "hello"
print(f"Hello, {name}! How's it {question}?")
输出:
Hello, Corley! How's it hello?
关于字符串格式化的更多用法可参考https://docs.python.org/3.6/library/string.html、https://realpython.com/python-string-formatting/#2-new-style-string-formatting-strformat和https://pyformat.info/#string_pad_align。
还有额外的基本语法和变量、字符串和输入输出的练习,如有需要,可以直接点击加QQ群 963624318 在群文件夹商业数据分析从入门到入职中下载即可。
本文原文首发来自博客专栏数据分析,由本人转发至https://www.helloworld.net/p/Y18puJ1u9MU6Z,其他平台均属侵权,可点击https://blog.csdn.net/CUFEECR/article/details/108690395查看原文,也可点击https://blog.csdn.net/CUFEECR浏览更多优质原创内容。