计算机最核心的三个部分为CPU、内存和硬盘,都在主板上面,除此之外,还包括键盘、鼠标等输入设备和屏幕等输出设备,如下:
CPU用于进行计算,硬盘用于存储数据和文件,内存(包括缓存)用于连接CPU和硬盘,作为两者的缓冲,可以加快读取和处理速率。
冯·诺依曼架构如下:
计算机通过输入逐行读取命令并执行,有输出则输出结果,程序是指定如何执行计算的一系列指令,可以说,程序就是写给计算机的菜谱。
但是程序思维和普通思维不太一样,比如:
对于一个陈述性知识(Declarative Knowledge)y是x的平方根,当且仅当y*y=x
,但是对于程序性知识(lmperative Knowledge)可能就不是这么表现的,可能如下:
很明显,思维是不完全一致的。 在人的语言中,很多语句存在歧义,计算机不一定能理解,因此需要专门的编程语言。
有一个典型的笑话:
老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。”当晚,程序员老公手捧一个包子进了家门。。。老婆怒道:“你怎么就买了一个包子?!”老公答曰:“因为看到了卖西瓜的。”
这虽然是一个笑话,但是可以看出计算机语言需要精确的表达,如果存在歧义就可能会出现不一样的结果。
程序员在码代码时经常会思考两个问题: (1)It doesn’t work,…,why? (2)It works,…,why? 这也是程序员很正常的状态。
程序员发展道路可以如下:
写程序应该遵循以下步骤:
编程语言的元素如下:
程序中的基本指令包括:
其中,后两者用于控制逻辑。
程序中常见的基本数据类型如下:
Python是一门计算机程序语言,可以理解为人对计算机的指令。
Python之所以这么火,与它的特点有关:
Python的典型应用包括数据分析、软件开发两大领域: Python中有很多库支持数据分析,包括numpy、pandas、scipy、matplotlib、networkx等; 支持软件开发的库包括Django、Flask和Pyramid等,包括Dropbox、Youtube、Instagram、豆瓣、知乎、魔兽世界等网站和应用都是完全或部分使用Python实现的。
虽然对于视频流、3D游戏等应用,Python还是存在一定的局限,但是它的确有着广泛的应用,所以在IT领域的各个子领域可以使用Python这同一门语言。 Python比较年轻,但是发展迅速,并且从2010年以后由于数据分析等应用得到了快速发展。 同时由于其开源免费,相比于SAS等其他语言,能够更容易被使用者接受,进一步扩大了其应用。
为什么会选择Python作为入门和开发语言:
Python存在Python2和Python3两个版本,现在Python2已经停止更新,Python3已逐渐成为主流。 Python最常用的IDE(集成开发环境,lntegrated Development Environment)是PyCharm,但是只有专业版(付费)才支持科学计算和数据分析,社区版(免费)不支持科学计算,因此进行数据分析和科学计算还有其他选择,这里选择专业的科学分析工具集Anaconda,并且选择Python3版本。
由于在官网中下载较慢,因此我已经将Anaconda安装包下载整理好了,可以直接加QQ群 963624318 在群文件夹Python相关安装包中下载即可。
安装和普通软件安装类似,直接点下一步即可,只是需要注意,在选择是否添加环境变量时需要勾选,这样就可以直接在命令行中执行相关命令,在Anaconda安装好之后,Python也自动安装,并且安装了科学计算一般所需要的库,不需要自己再专门安装。
安装好之后,按WIN
键可以看到,应用列表中有Anaconda包含的工具集合,如下:
对于编写代码,有三个层次的工具:
Read-Evalulate-Print Loop
,即读取-求值-输出循环,也就是交互式的编程环境,如Jupyter Notebook。
其特点如下:
(1)优点 (2)缺点
点击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
即可显示有样式的文本,并且支持多种类型混合。
学习一门新的语言就像打开一个新的世界,计算机输出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
表示换行,后面的内容会换行输出;
\
可以将一行字符串换行输入,但是实际上还是一行。
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
编程都应该遵循一定的代码规范,这样既可以美化代码,也可以让别人更加直观地阅读代码、不至于不理解或产生误会。 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中有4种内置数值数据类型:
整型即整数。
输入:
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
为十六进制。
浮点型即小数。
可以使用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()
方法得出的都是浮点型,而**
的结果需要根据参与运算的数值的类型。
布尔型只有两个值,即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
表示且运算;
==
用于判断两个变量值是否相等,是逻辑运算符,需要注意与=
不同,它是赋值运算符。
字符串是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
不同的类型的数据之间可以进行类型转换。
浮点数转化为字符串如下:
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
可以看到,字符串与字符串实际上是字符串的拼接。
字符串可以进行结合与重复操作。 结合即字符串的拼接,如下:
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
字符串还可以进行提取和切片。 如下:
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]
用于将字符串倒序排列。
获取字符串长度使用len()
方法。
如下:
len(letters)
输出:
11
分割字符串使用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'
调用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次。
字符串可以设置长度和对齐方式,如果字符串长度不够则用空格将前后补全。 如下:
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'
对于字符串,还有很多其他使用的方法,以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.’ |