作者:贾胜杰,硕士,退役军人,电气工程专业,现成功转行K12领域数据挖掘工程师,不仅在数据清理、分析和预测方向,而且在自制力和高效学习方面都有丰富经验。
Python可以说是近两年最火的编程语言了,这主要是因为它的以下两个突出特点:
⚠️文中会涉及的编程相关术语较多,关键术语我会进行解释,其他的我会以链接的形式供大家自行查阅。
本篇文章包含的知识点有:环境搭建,Python编码规范,变量与字面量,数据类型与运算符,控制流,函数。
环境搭建
所谓“环境搭建”,就是在电脑本机或线上提前准备好Python数据分析的基本需求,好比是在烹饪前先搭建好灶台一样。这里相对简单,我做出一些推荐和评价,大家按需去选择安装就行。
本地搭建首选:Anaconda[https://www./], the world's most popular data science platform.
对小白友好,直接下载安装即可,内置数据科学相关的所有库;后期熟练了之后,还可以用于环境&库管理;自带Jupyter Notebook[https:///](可能是现阶段最好用的数据科学工具)和Spyder[https://www.](不是特别好用的Python IDE[https://en./wiki/Integrated_development_environment])。
线上首选:Azure Notebook[https://notebooks./]。如果你不想在自己的电脑上配置环境,那么你可以尝试下线上的Notebook;如果你用Google方便,那强烈推荐 Google Colab[https://colab.research.google.com/],在这里你还能用上免费的GPU。
编辑器推荐:Visual Studio Code[https://code./],拓展丰富,配色美观,一旦用上就会爱上。
配置好之后尝试你的第一个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中,我们按照变量名 = 某值
的方式对变量进行赋值
:
a = 123
name = 'Allen'
字面量就是那些只能代表自己实际值的量,比如说上面代码中的123
和'Allen'
,字面量不能做为变量名。
⚠️变量名的命名规则:用字母或字母数字的组合表示;数字不能作为变量名的开头;变量名中不能出现空格,可以用_
代替空格;变量名要起得有意义,比如说表示名字,最好使用name
或name_1
等。
数据类型
我们在工作中会遇到各种类型的数据,比如数字、字符、图片等等,那么Python在处理这些数据时,会根据他们的类型,贴上一个标签,这个标签就是数据类型
。
整型(int)
浮点型(float)
布尔型(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
循环语句
for循环
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
当期变量值为 : 6
continue是跳过当前循环块中的剩余语句, 也就是跳过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([a],[b])
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 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
123
nonlocal的用法类似,用在嵌套函数中,当只想修改嵌套作用域的变量而非全局变量时使用。
可更改对象与不可更改对象
在数据类型中也提到过,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函数在后续的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:///)
Python for Data Analysis, 2nd Edition(http://ick/Qve)
Python Cookbook(http://python3-cookbook./zh_CN/latest/)