点击上方“AI派”,选择“设为星标”
最新分享,第一时间送达!

![]()
作者:贾胜杰,硕士,退役军人,电气工程专业,现成功转行K12领域数据挖掘工程师,不仅在数据清理、分析和预测方向,而且在自制力和高效学习方面都有丰富经验。
编辑:王老湿
Hi,各位同学,《从0到1,数据分析师修炼之路》专栏关于修炼技法的部分已经发布了两篇文章:
今天开始我们就会进入到Python的学习阶段,Python可以说是近两年最火的编程语言了,这主要是因为它的以下两个突出特点:
简单易学,一周入门,会英语就能读懂Python,比如说
print('Hello world!')执行的功能就是其字面意思;拓展丰富,取之不尽的拓展包让Python如虎添翼,不管是做Web开发还是人工智能,Python都可以轻松搞定。
⚠️文中会涉及的编程相关术语较多,关键术语我会进行解释,其他的我会以链接的形式供大家自行查阅。
本篇文章包含的知识点有:环境搭建,Python编码规范,变量与字面量,数据类型与运算符,控制流,函数。
环境搭建
所谓“环境搭建”,就是在电脑本机或线上提前准备好Python数据分析的基本需求,好比是在烹饪前先搭建好灶台一样。这里相对简单,我做出一些推荐和评价,大家按需去选择安装就行。
本地搭建首选:Anaconda[https://www.anaconda.com/],
the world's most popular data science platform.对小白友好,直接下载安装即可,内置数据科学相关的所有库;后期熟练了之后,还可以用于环境&库管理;自带Jupyter Notebook[https://jupyter.org/](可能是现阶段最好用的数据科学工具)和Spyder[https://www.spyder-ide.org](不是特别好用的Python IDE[https://en.wikipedia.org/wiki/Integrated_development_environment])。线上首选:Azure Notebook[https://notebooks.azure.com/]。如果你不想在自己的电脑上配置环境,那么你可以尝试下线上的Notebook;如果你用Google方便,那强烈推荐 Google Colab[https://colab.research.google.com/],在这里你还能用上免费的GPU。
编辑器推荐:Visual Studio Code[https://code.visualstudio.com/],拓展丰富,配色美观,一旦用上就会爱上。
配置好之后尝试你的第一个python代码吧!
print('Hello world!')
Python编码规范
编码规范是法律一样的存在,非常重要,所以请大家一定要恪守这个法律,在初学阶段打好基础,养成良好的编码习惯。
行与缩进
python最具特色的就是使用缩进来表示代码块, 同一个代码块的语句必须包含相同的缩进空格数,缩进的空格数是可变的,但是有个不成文的规定就是使用4个空格的缩进。
比如:
if True: print ("True") else: print ("False")但如果像如下这样就会因为缩进问题报错:
if True: print ("Answer") print ("True") else: print ("Answer") print ("False") # 缩进不一致,会导致运行错误报错会提示如下:
IndentationError: unindent does not match any outer indentation level所以,如果你的程序运行后,出现这种错误提示,那你就要检查下,你的代码缩进是不是有问题了。
注释
Python中单行注释以 # 开头,多行注释可以用多个 #号,或者 '''和 """(主要作声明函数用),示例如下:
# 注释1
# 注释2
def hello():
'''
this is a print function.
'''
print ('Hello,Python!')
更多更详细的python编写规范请参考 PEP8规定(https://www.python.org/dev/peps/pep-0008/),或者查看中文版(https://blog.youkuaiyun.com/ratsniper/article/details/78954852)。
变量与字面量
变量与数学方程中的概念类似,都是用于指代某一值,便于在其他位置调用。在Python中,我们按照变量名 = 某值的方式对变量进行赋值:
a = 123
name = 'Allen'
字面量就是那些只能代表自己实际值的量,比如说上面代码中的123和'Allen',字面量不能做为变量名。
⚠️变量名的命名规则:用字母或字母数字的组合表示;数字不能作为变量名的开头;变量名中不能出现空格,可以用
_代替空格;变量名要起得有意义,比如说表示名字,最好使用name或name_1等。
数据类型
我们在工作中会遇到各种类型的数据,比如数字、字符、图片等等,那么Python在处理这些数据时,会根据他们的类型,贴上一个标签,这个标签就是数据类型。
整型(int)
表示整数。在混合计算中,python会把整型转为浮点型,如
5 / 2;可以使用
int(value)来将数字value转换为int类型。
浮点型(float)
表示小数。特别的,在Pandas和Numpy等库中会用
NaN(Not a Number)填充某一表格中的空值,但这个NaN的类型是浮点型;可以使用
float(value)来将数字value转换为float类型。
布尔型(bool)
只有两个值即
True与False,表示真与假,主要用于逻辑判断;可以使用
bool(value)来将值value转换为bool类型。
?这里可能会有一些疑惑,在python中,所有的
0以及空值的布尔值都为False, 比如说None,0(整型0),0.0(浮点型0),0.0+0.0j(复数0),''(空字符串),[](空列表),()(空元组),{}(空字典)等。这在后面做逻辑判断中,非常有用。
字符串(str)
字符串就是由字符穿起来的串儿,会放在单引号或者双引号,甚至是三引号中。
?四引号可以吗?自己试试看!
定义
一般的,我们把一串字符放到引号中就可以定义一个字符串,但如果这串字符中就包含有引号时,就会跟界定字符串的引号发生冲突,这怎么办呢?比如说I'm Allen或者He said:"Life is short.".其实并不难,我们只需要解决这个冲突就可以了
#方法一:换其他引号作为字符串的界定
str_a = “I'm Allen”
str_a = 'He said:"Life is short."'
#方法二:使用转义符号
str_a = 'I\'m Allen'
?特别的,三引号可以保持原字符串的排版格式,试试看~
索引
当我们想从某个字符串中提取某一个字符的时候,就需要用到索引了,你可以把索引理解为某字符在字符串中的次序,然后把这个次序放到一对中括号里就可以了。比如
str_a = 'Life is short.' #定义一个字符串
#提取f,利用正索引(从左往右,从0开始计数)
str_a[2]
#提取h,利用负索引(从右往左,从-1开始计数)
str_a[-5]
索引是一个非常重要的概念,随着学习的深入,你会发现索引无处不在。
切片
利用索引提取字符串中某一部分就是切片。其用法为[起始位:终止位:步长],得到的是一个由起始位到终止位间隔为步长-1的前闭后开区间。
str_a[3:6] #步长为1时可以省略,提取的结果为'e i'(注意空格也算一位)
str_a[1:6:2] #结果为'iei'
?
str_a[::-1]的结果会是什么呢?动手试试看!
常用函数
#查看字符串长度
len(str_a)
#修改字符串的大小写
str_a.upper() #全部改为大写
str_a.lower() #全部改为小写
str_a.title() #改为首字母大写
#查看字符's'在str_a中的索引
str_a.index('s')
#字符串拼接
str_a + str_b
str_a * n #str_a重复n次
列表(List)
写在方括号 [] 内,各元素用逗号分隔开。元素可以是数字、字符串或者列表。可以看到,字符串是字符组成的可迭代对象(iterable),而列表是由元素组成的可迭代对象,所以,两者的很多属性都是相通的,比如说索引和切片都可以用在列表中。
列表与字符串
str_a = '小学_数学_第一次考试'
#将str_a中的各个属性挑出来
str_a.split('_') #根据字符'_'对字符串进行分割
>>> 结果:['小学','数学','第一次考试']
#我们将列表list_a = ['小学','数学','第一次考试']合并为字符串
'_'.join(list_a) #将字符'_'添加到各个元素中间,并进行连接
>>> 结果:'小学_数学_第一次考试'
常用函数
len()、index()函数及+/*的用法与字符串一致。
#添加元素
list_a.append('a') #将字符a添加到list_a的末尾
list_a.insert(index,'a') #将字符a插入到list_a中索引为index的位置
#删除元素
list_a.remove('a)
#排序
list_a.sort(reverse=False) #默认升序,可设置reverse=True来实现降序
字典(Dictionary)
写在大括号{ }里,是一个无序的键(key):值(value)对集合,每一对用逗号隔开。
key必须为不可变类型,如Number(数字)或String(字符串),并且在一个字典中每个key都是唯一的
#定义
dict_a = {'小明':'优秀','小华':'优秀','小李':'良好'}
#增加
dict_a['小王'] = '良好'
#提取
dict_a['小明']
dict_a.get('小明')
>>> 结果:'优秀'
#查看所有key,value等
dict_a.keys()
dict_a.values()
dict_a.items() #返回所有的key,value对
#更新
dict_a.update(dict_b) #用dict_b更新dict_a
运算符
算术运算符
假设 a = 12, b = 26
| 运算符 | 描述 | 实例 |
|---|---|---|
| + | 加,数字就是做加法/字符串就是拼接 | a + b 输出结果 28 |
| - | 减,做减法 | a - b 输出结果 -28 |
| * | 乘 ,数字的话就是相乘/字符串的话就是重复若干次 | a * b 输出结果 312 |
| / | 除,做除法 | b / a 输出结果 2.1666666666666665 (自动转化为浮点型) |
| % | 取模 , 即做除法后的余数 | b % a 输出结果 2 |
| ** | 幂 | a**b 为12的26次方 |
| // | 取整,即做除法后的商 | 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0 |
赋值运算符
| 运算符 | 描述 | 实例 |
|---|---|---|
| = | 简单的赋值运算符 | c = a + b 将 a + b 的运算结果赋值为 c |
| += | 加法赋值运算符 | c += a 即 c = c + a(常用 i += 1,表示递增) |
| -= | 减法赋值运算符 | c -= a 即 c = c - a |
比较运算符
| 运算符 | 描述 |
|---|---|
| == | 等于;比较对象是否相等 |
| != | 不等于;比较两个对象是否不相等 |
| > | 大于 ;返回x是否大于y |
| < | 小于 ;返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。 |
| >= | 大于等于;返回x是否大于等于y。 |
| <= | 小于等于;返回x是否小于等于y。 |
逻辑运算符
| 运算符 | 逻辑表达式 | 描述 |
|---|---|---|
| and | x and y | 即逻辑 “与” |
| or | x or y | 即逻辑 “或” |
| not | not x | 即逻辑 “非” |
成员运算符
即查看指定的序列中是否存在某值,这个序列可以是字符串、列表或者元组。
| 运算符 | 描述 |
|---|---|
| in | 找到值返回 True,否则返回 False。 |
| not in | 与in相反 |
恒等运算符
| 运算符 | 描述 |
|---|---|
| is | 检查两边是否恒等 |
| is not | 检查两边是否不恒等 |
控制流
条件语句if
代码模板:
if <条件判断1>: <执行1> elif <条件判断2>: <执行2> elif <条件判断3>: <执行3> else: <执行4>注意:一定要注意缩进与对齐,尤其是有if语句嵌套的情况下。
循环语句
for循环
for循环可以遍历任何序列的项目,如一个列表或者一个字符串,通俗点说,就是把这个序列中的第一个元素到最后一个元素依次访问并执行冒号后面的语句
其一般格式为:
for <元素> in <序列>: <执行语句>
while循环
for循环和while循环,两者的相同点在于都能循环做一件重复的事情;不同点在于,for循环是在序列穷尽时停止,while循环是在条件不成立时停止。当这个条件永远不为False时,就会出现死循环。
其一般格式为:
while <判断条件>: <执行语句>
break和continue
break 语句可以跳出 for 和 while 的循环体。
示例:
for letter in 'Python': # for实例 if letter == 't': break print ('当前字母为 :', letter) i = 10 # while实例 while i > 0: print ('当期变量值为 :', i) i -= 1 if i == 5: break执行语句后的输出结果为:
当前字母为 : P 当前字母为 : y 当期变量值为 : 10 当期变量值为 : 9 当期变量值为 : 8 当期变量值为 : 7 当期变量值为 : 6continue是跳过当前循环块中的剩余语句, 也就是跳过continue后面的语句
示例:
for letter in 'Python': # for实例 if letter == 't': continue print ('当前字母为 :', letter) i = 5 # while实例 while i > 0: i -= 1 if i == 3: continue print ('当期变量值为 :', i)执行代码后的输出结果为:
当前字母为 : P 当前字母为 : y 当前字母为 : h 当前字母为 : o 当前字母为 : n 当期变量值为 : 4 当期变量值为 : 2 当期变量值为 : 1 当期变量值为 : 0
综上呢,for更适合可迭代情况下使用,while更适合不知道要循环多少次的时候使用。
zip函数
zip函数的输入位可迭代的对象,输出为对应元素的元组
其一般格式为:
zip([a],[b])
使用zip函数可以节约不少内存
可以使用list()来转换输出zip函数的结果
若zip的两个输入序列长度不一致,则以短的那个为参考
*zip可以理解为zip的反函数,可以将元组解压为列表
示例:
a = [1,2]
b = [3,4]
c = [5,6,7]
zip_1 = zip(a,b)
print(list(zip_1))
>>> [(1,3),(2,4)]
zip_2 = zip(a,c)
print(list(zip_2))
>>> [(1,5),(2,6)]
a1,c1 = zip(*zip_1)
print(a1,c1)
>>> (1,2) (3,4)
enumerate函数
该函数是将一个可遍历的数据对象(如列表、元组或字符串)组合为一个带索引和元素的元组
其一般格式为:
enumerate(<序列>, start=0) #start表示下标的起始位置常与for…in…联用
示例:
a = [1,2] print('起始下标为默认:') for i,j in enumerate(a): print(i,j) print('起始下标为1:') for i,j in enumerate(a,start = 1): print(i,j)执行代码,输出结果为:
起始下标为默认: 0 1 1 2 起始下标为1: 1 1 2 2
列表推导式
列表推导式是一种非常Pythonic的方式,可以简单理解为:定义一个空表,然后用表中的语句填充该表。
其一般格式为:
[表达式 for 变量 in 序列或迭代对象]示例:
#查看两个列表中的不同元素 #普通方式 diff = [] for item in list_a: if item not in list_b: diff.append(item) #列表推导式 [item for item in list_a if item not in list_b] #与zip函数结合,计算两个列表对应元素之和 [i[0]+i[1] for i in zip(list_a,list_b)]
函数
定义函数
其一般格式为:
def 函数名(参数): ''' 函数说明 ''' 函数语句函数说明是建议非必需
函数语句最后以return(表达式)结尾,则返回值;若不带表达式,则返回None
参数
默认参数和关键字参数不在赘述,在此只讲述一种不定长参数。
若在参数前面加一个星号
*,则将所有未命名的参数以元组的形式导入;若在参数前面加两个星号
**,则参数会以字典的形式导入。
示例:
#定义函数
def tupleprint(a, *tupleb ):
'''
打印任何传入的参数
'''
print ("输出: ")
print (a)
print (tupleb)
#调用函数
tupleprint(1,2,3)
执行代码,输出结果为:
输出:
1
(2, 3)
变量作用域
变量的作用域就是能访问该变量的程序部分。
在python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域 ,而其他如if/for/while等是不会引入新的作用域的。
全局变量即可以在整个程序范围内都可以访问;局部变量只能在其被定义的函数内调用。
示例:
global_a = 0 # 这是一个全局变量 # 定义函数 def sum( a, b ): global_a = a + b # global_a在这里是局部变量. print ("局部变量为: ", global_a) return global_a #调用函数 sum(1,2) print ("全局变量为: ", global_a)执行代码,输出结果为:
局部变量为: 3 全局变量为: 0当局部代码想要修改全局变量时,就会用到global和nonlocal关键字了 。
示例:
num = 1 def fun1(): global num # 需要使用 global 关键字声明 print(num) num = 123 print(num) fun1() print(num)执行代码,输出结果为:
1 123 123nonlocal的用法类似,用在嵌套函数中,当只想修改嵌套作用域的变量而非全局变量时使用。
可更改对象与不可更改对象
在数据类型中也提到过,python中的可变类型(列表、字典和集合)与不可变类型(数字,字符串和元组),那在函数中作为变量进行传递时会是怎样呢?
示例1:
#定义函数
def fun1(a):
a = 2
print(a)
b = 1
fun1(b)
print(b)
示例2:
def fun2(list_a):
list_a.append(2)
print(list_a)
list_b = [0,1]
fun2(list_b)
print(list_b)
尝试下,上面这两个示例的输出结果,有什么区别?
匿名函数
使用lambda创建
所谓匿名,就是不需要def语句
拥有自己的命名空间,而且只能访问自己命名空间中的变量
语法格式为:
lambda <变量>:<语句>
lambda函数在后续的Pandas数据分析中会经常用到,一定要熟练掌握呀。
最后
对于小白来说,编写代码是个很大的挑战,如果刚开始写不出来,那可以尝试先按照‘目的-拆分步骤-逐个实现’的流程去写伪代码,然后再翻译成python语句,比如:
#问题:对学生进行成绩分级,90分以上为A,80分-90分为B,其余为C
#目的:输入 成绩,按照规则对应为评分并输出
#步骤&伪代码:
#1.输入成绩
#2.对成绩进行判断,如果成绩大于90,则返回A;如果成绩大于80则返回B;其余返回C;(分情况判定 用if语句)
#翻译成python
def score_to_grade(score): #定义函数,输入成绩score
if score > 90:
return ('你获得了:A')
elif score > 80:
return ('你获得了:B')
else:
return ('你获得了:C')
这里只是举了一个很简单的例子,但面对的问题越复杂,就越要尝试用目的-拆分步骤-逐个实现的流程去做,复杂问题就会迎刃而解了。
必应搜索
菜鸟教程(http://www.runoob.com/python3/python3-tutorial.html)
stackoverflow(https://stackoverflow.com/)
Python for Data Analysis, 2nd Edition(http://1t.click/Qve)
Python Cookbook(http://python3-cookbook.readthedocs.io/zh_CN/latest/)

点下「在看」,给文章盖个戳吧!
本文详细介绍了Python编程的基础知识,包括环境搭建、编码规范、变量与数据类型、运算符、控制流和函数等内容,适合初学者快速掌握Python编程。
996

被折叠的 条评论
为什么被折叠?



