理解代码,远比记忆代码更重要
打开notebook或IDE前,可先参考Python基础知识图,以帮助理解代码。
如需要,可点击链接百度网盘查看Python基础知识图PDF:MindMap_Python基础.pdf
文章目录
0.HelloWorld
print('Hello wolrd!')
Hello wolrd!
print('第2个单元格')
第2个单元格
name='Python3:猴子数据分析社群'
name
'Python3:猴子数据分析社群'
1.数据类型
- 输入数据->程序(处理数据)->输出数据:eg.微信公众号,可理解成一个程序
- 变量名,变量值,变量名格式:nameStr,大小写,不同含义
- 注释:两种,’’‘注释’’’, #注释
- 不可变的数据类型:字符串、数值、元祖
1.1 字符串 String
- 定义
#案例1:定义字符串
nameStr='马云'
moneyStr2='有钱'
#字符串合并
print('用+将字符串合并:',nameStr+moneyStr2)
用+将字符串合并: 马云有钱
- 格式化
#案例2:用%s格式化字符串
str1='我叫 %s ,俺爹是 %s ' % ('王思聪', '王健林')
print(str1)
我叫 王思聪 ,俺爹是 王健林
1.2 数值 Number
- 整型
#1)整型:年龄50岁
age=50
age
50
- 浮点型
#2)浮点型:余额宝收益3.53元
money=3.53
print('我余额宝收益是',money)
我余额宝收益是 3.53
1.3 容器
- 容器=钱包,可存放多个数据,有列表list,元祖tuple,集合sets,字典dictionary
1)列表 List
- 定义:方括号
#定义列表:病人姓名
nameList=['猴子','马云','王健林','马化腾']
#列表长度
nameLen=len(nameList)
print('列表长度:病人数目:',nameLen)
列表长度:病人数目: 4
- 4个操作(增加、删除、修改、查找)
#1)容器操作:增加
# 尾部增加对象
nameList.append('刘强东')
print('增加1个元素:',nameList)
增加1个元素: ['猴子', '马云', '王健林', '马化腾', '刘强东']
比较append() extend() insert()
a = [1,2]
a.append(('b','c')) # 直接在尾部增加一个对象
print(a)
b = [1,2]
b.extend(('b','c')) # 序列的元素依次在尾部添加
print(b)
c = [1,2]
c.insert(1,'c') # 指定在索引1的元素前!添加一个对象
print(c)
[1, 2, ('b', 'c')]
[1, 2, 'b', 'c']
[1, 'c', 2]
#2)容器操作:删除
# 注意下标索引
del nameList[1]
print('删除第2个元素:',nameList)
删除第2个元素: ['猴子', '王健林', '马化腾', '刘强东']
#3)容器操作:查询
# 使用下标索引来访问列表中的值,下标从0开始
name1=nameList[0]
print('查询列表的第1个元素:',name1)
查询列表的第1个元素: 猴子
#4)容器操作:修改
# 直接指定下标的值
print('修改之前第1个元素是:',nameList[0])
nameList[0]='孙悟空'
print('修改之后第1个元素是:',nameList[0])
修改之前第1个元素是: 猴子
修改之后第1个元素是: 孙悟空
nameList
['孙悟空', '王健林', '马化腾', '刘强东']
2)元祖 Tuple
- 定义:小括号
# 定义元祖
# 6家公司的股票
gafataTuple=('腾讯','阿里巴巴','苹果','谷歌','Facebook','亚马逊','亚马逊')
print(gafataTuple)
('腾讯', '阿里巴巴', '苹果', '谷歌', 'Facebook', '亚马逊', '亚马逊')
# 元祖长度
gafataLen=len(gafataTuple)
print('元祖长度:',gafataLen)
元祖长度: 7
- 操作:查询
- 不能修改
# 操作:查询
# 第1个元素
print('第一个元素的值:',gafataTuple[0])
第一个元素的值: 腾讯
3)集合 Sets
- 定义:花括号
'''
容器:集合(Sets)是一个没有重复元素的容器
'''
#定义集合
# 定义一个空的集合
stockSets=set()
# 6家公司的股票
gafataSets={'腾讯','阿里巴巴','苹果','谷歌','Facebook','亚马逊','亚马逊'}
print(gafataSets)
{'苹果', '亚马逊', 'Facebook', '腾讯', '阿里巴巴', '谷歌'}
- 4个操作(增加、删除、修改、查找)
- 特点: 没有重复元素,适合去重操作和关系判断
#1)容器操作:增加
# 使用update()增加元素
stockSets.update(['腾讯','阿里巴巴','京东'])
print(stockSets)
{'腾讯', '阿里巴巴', '京东'}
#2)容器操作:删除
stockSets.discard('京东')
print(stockSets)
{'腾讯', '阿里巴巴'}
#3)容器操作:查找
txBool='腾讯' in stockSets
print(txBool)
True
#4)容器操作:修改
#第1步:先删除
stockSets.discard('京东')
#第2步:再添加
# 尾部添加
stockSets.update(['京东'])
print(stockSets)
{'腾讯', '阿里巴巴', '京东'}
4)字典
- 定义:花括号,key-value
'''
容器:字典(Dictionary)
'''
#定义字典:病人编号和姓名的映射关系
patientDic={'001':'猴子','002':'马云','003':'王健林','004':'马化腾'}
print(patientDic)
{'001': '猴子', '002': '马云', '003': '王健林', '004': '马化腾'}
#定义字典:excel病人数据存储
patientDic2={'001':['猴子',29,'1型糖尿病','较差'],
'002':['马云',34,'2型糖尿病','好转'],
'003':['王健林',28,'1型糖尿病','显著好转'],
'004':['马化腾',52,'2型糖尿病','好转']}
print(patientDic2)
{'001': ['猴子', 29, '1型糖尿病', '较差'], '002': ['马云', 34, '2型糖尿病', '好转'], '003': ['王健林', 28, '1型糖尿病', '显著好转'], '004': ['马化腾', 52, '2型糖尿病', '好转']}
- 4个操作(增加、删除、修改、查找)
#1)容器操作:增加
patientDic2['005']=['王思聪',30,'1型糖尿病','好转']
print(patientDic2)
{'001': ['猴子', 29, '1型糖尿病', '较差'], '002': ['马云', 34, '2型糖尿病', '好转'], '003': ['王健林', 28, '1型糖尿病', '显著好转'], '004': ['马化腾', 52, '2型糖尿病', '好转'], '005': ['王思聪', 30, '1型糖尿病', '好转']}
#2)容器操作:删除
del patientDic2['005']
print(patientDic2)
{'001': ['猴子', 29, '1型糖尿病', '较差'], '002': ['马云', 34, '2型糖尿病', '好转'], '003': ['王健林', 28, '1型糖尿病', '显著好转'], '004': ['马化腾', 52, '2型糖尿病', '好转']}
#3)容器操作:查询
# 根据病人编号查询病人信息
valueList1=patientDic2['001']
print(valueList1)
['猴子', 29, '1型糖尿病', '较差']
#4)容器操作:修改
print('修改之前,病人信息:',patientDic2['001'])
patientDic2['001']=['猴子', 29, '1型糖尿病', '好转']
print('修改之后,病人信息:',patientDic2['001'])
修改之前,病人信息: ['猴子', 29, '1型糖尿病', '较差']
修改之后,病人信息: ['猴子', 29, '1型糖尿病', '好转']
print(patientDic2)
{'001': ['猴子', 29, '1型糖尿病', '好转'], '002': ['马云', 34, '2型糖尿病', '好转'], '003': ['王健林', 28, '1型糖尿病', '显著好转'], '004': ['马化腾', 52, '2型糖尿病', '好转']}
- items() values() keys()
- items() 函数以列表返回可遍历的(键, 值) 元组数组
- keys() 函数以列表返回一个字典所有的键
- values()函数以列表返回一个字典所有的值
webDict = {'Google': 'www.google.com', 'Runoob': 'www.runoob.com', 'taobao': 'www.taobao.com'}
print ('字典 : %s' % webDict.items())
print('键 :%s' % webDict.keys())
print('值 :%s' % webDict.values())
for key,value in webDict.items():
print (key,value)
字典 : dict_items([('Google', 'www.google.com'), ('Runoob', 'www.runoob.com'), ('taobao', 'www.taobao.com')])
键 :dict_keys(['Google', 'Runoob', 'taobao'])
值 :dict_values(['www.google.com', 'www.runoob.com', 'www.taobao.com'])
Google www.google.com
Runoob www.runoob.com
taobao www.taobao.com
1.4 布尔 bool
- True,False
print(1==1)
True
print(1<0)
False
1.5 空值 None
age=None
if age==None:
print('年龄是空值')
else:
print('年龄不是空值')
年龄是空值
2.条件判断
- 代码块格式:缩进,if-elif-else
- 边界条件:值比较,逻辑比较
'''
边界条件:值判断
'''
# 案例:判断豆瓣评分是否看《摔跤吧,爸爸》
scoreNum=9.1
if scoreNum >=8 :
print('我要去看这部电影')
else:
print('电影太烂,不去看了')
我要去看这部电影
'''
边界条件:逻辑判断
'''
# 案例:判断是否有叫猴子的病人
nameList=['猴子','马云','王健林','马化腾']
if '猴子' not in nameList:
print('列表中没有叫猴子的病人')
else:
print('列表中有个叫猴子的病人')
列表中有个叫猴子的病人
'''
多个条件判断:if-elif-else
'''
age=int(input('输出狗狗的年龄,按enter键获取对应人类的年龄:'))
if age < 0 :
print('狗狗年龄不能小于0')
elif age == 1:
print('相当于14岁的人')
elif age == 2 :
print('相当于22岁的人')
else:
human=22+(age-2)*5
print('对应人类年龄',human)
输出狗狗的年龄,按enter键获取对应人类的年龄:4
对应人类年龄 32
3.循环:批量处理数据
- 案例1:每天吃饭
#重复性工作
print('吃第1次饭')
print('吃第2次饭')
print('吃第3次饭')
吃第1次饭
吃第2次饭
吃第3次饭
# 定义列表
eatList=['吃第1次饭','吃第2次饭','吃第3次饭']
# 循环
for i in eatList:
print(i)
吃第1次饭
吃第2次饭
吃第3次饭
- 案例2:清洗GAFATA股票数据
'''
定义字典:6家公司(GAFATA)的股票
key是公司名称,value是股票代码
'''
gafataDict={'谷歌':'Goog','亚马逊':'aMZN','Facebook':'FB',
'苹果':'aapl','阿里巴巴':'BABA','腾讯':'0700'}
#将股票代码全部大写
for key,value in gafataDict.items():
#对股票代码转换成大写
newValue=value.upper()
#将转换后新的股票代码赋值给对应的key
gafataDict[key]=newValue
print(gafataDict)
{'谷歌': 'GOOG', '亚马逊': 'AMZN', 'Facebook': 'FB', '苹果': 'AAPL', '阿里巴巴': 'BABA', '腾讯': '0700'}
- continue和break
- continue:跳出当前循环
- break:退出整个循环
# continue用法
# 输出不是苹果的公司股票情况
for key,value in gafataDict.items():
if(key=='苹果'):
continue
print('当前公司:',key,',当前股票代码:',value)
当前公司: 谷歌 ,当前股票代码: GOOG
当前公司: 亚马逊 ,当前股票代码: AMZN
当前公司: Facebook ,当前股票代码: FB
当前公司: 阿里巴巴 ,当前股票代码: BABA
当前公司: 腾讯 ,当前股票代码: 0700
# break用法
# 查找苹果公司的股票代码,并记录查找次数
number=0
for key,value in gafataDict.items():
number=number+1
if(key=='苹果'):
print('查找',key,'公司的股票代码是',value)
break
print('当前公司:',key,',当前股票代码:',value)
print(number)
当前公司: 谷歌 ,当前股票代码: GOOG
当前公司: 亚马逊 ,当前股票代码: AMZN
当前公司: Facebook ,当前股票代码: FB
查找 苹果 公司的股票代码是 AAPL
4
4.函数
- 定义
'''
定义函数
函数功能:两个数相加
输入:x,y是要相加的两个数
输出:两个数相加的和
'''
def add(x,y):
z=x+y
return z
- 调用:两种方式
# 方式1
a=1
b=2
c=add(x=a,y=b)
print('1和2相加等于',c)
1和2相加等于 3
# 方式2
d=add(a,b)
print('1和2相加等于',d)
1和2相加等于 3
- 函数参数:不可变/可变数据类型
# 不可变数据类型:字符串、数值、元祖
def changeInt(a):
a=a+1
'''
使用函数
参数是不可变数据类型(字符串,元祖,数值):
传递的只是该数据类型的值(相当于复制一份)
'''
b=1
print('调用函数之前b的值=',b)
changeInt(b)
print('调用函数之后b的值=',b)
调用函数之前b的值= 1
调用函数之后b的值= 1
# 可变数据类型
def changeList(inputList):
inputList.append('奶茶妹妹')
'''
使用函数
参数是可变数据类型:
传递的是该变量的引用地址
'''
nameList=['马云','刘强东']
print('调用函数之前的值:',nameList)
changeList(nameList)
print('调用函数之后的值:',nameList)
调用函数之前的值: ['马云', '刘强东']
调用函数之后的值: ['马云', '刘强东', '奶茶妹妹']
- 变量作用域:全局/局部
- 定义在函数内部的变量拥有一个局部作用域:只能在其被声明的函数内部访问
- 定义在函数外的拥有全局作用域:可以在整个程序范围内访问
#局部作用域,在生命函数外访问会出错
def test():
aStr='别理会他人闲言闲语,今日随他们,让他们说吧,你的机会将会到来,再来证明自己。'
#在函数外面,访问函数内的局部变量aStr
print(aStr)
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-48-28640fabe4dd> in <module>
4
5 #在函数外面,访问函数内的局部变量aStr
----> 6 print(aStr)
NameError: name 'aStr' is not defined
- python特点:
- 可嵌套定义函数:调用外层函数时,运行到的内层def语句仅仅是完成对内层函数的定义,而不会去调用内层函数,除非在嵌套函数之后又显式调用
- 可返回一个函数
- 嵌套作用域:在嵌套的函数返回后却仍然有效,即闭包的现象
- 闭包:在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数就被认为是闭包
# 案例1:嵌套定义
def f1():
x = 88
def f2():
print(x)
f2() # 显式调用
x=90
f1()
88
# 案例2:嵌套作用域,闭包现象
# 函数f1中定义了函数f2,f2引用了f1嵌套作用域内的变量x,并且f1将函数f2作为返回对象进行返回
def f1():
x = 88
def f2():
return x
return f2
# 变量action获取了返回的f2,虽然此时f1函数已经退出结束了,但是f2仍然记住了f1嵌套作用域内的变量名x
action = f1()
action()
88
# 案例3:闭包
def maker(n):
k=8
def action(x):
return x**n+k
return action
f=maker(2)
f(4) # 内嵌函数就是通过调用工厂函数时,运行内部的def语句而创建的
24
5.模块
- 内置模块
- 第三方包
- 包的组织结构:
- 模块 .py文件:python只能导入.py文件
- 包 文件夹
5.1 内置模块
''''
Python内置模块
'''
#第1步:引入模块
import sys
#第2步:使用模块中的函数,属性
pathList=sys.path
print('Python 路径为:\n', pathList)
Python 路径为:
['C:\\Users\\queenie_yoga\\第2关:零基础掌握人工智能核心语言Python', 'D:\\Coding\\Anaconda3\\python37.zip', 'D:\\Coding\\Anaconda3\\DLLs', 'D:\\Coding\\Anaconda3\\lib', 'D:\\Coding\\Anaconda3', '', 'D:\\Coding\\Anaconda3\\lib\\site-packages', 'D:\\Coding\\Anaconda3\\lib\\site-packages\\win32', 'D:\\Coding\\Anaconda3\\lib\\site-packages\\win32\\lib', 'D:\\Coding\\Anaconda3\\lib\\site-packages\\Pythonwin', 'D:\\Coding\\Anaconda3\\lib\\site-packages\\IPython\\extensions', 'C:\\Users\\queenie_yoga\\.ipython']
5.2 第三方包
# 安装包
'''
Anaconda Prompt命令行,进入conda环境
使用conda命令安装包:conda install pandas
使用第三方模块:pandas
pandas是数据分析工具
'''
#引入模块
import pandas as pd
#文件路径(注意本地路径或可上传到jupyter服务器)
fileNameStr='E:\Queenie\充电集合\数据分析\数据分析(高级)(Python)\第2关:零基础掌握人工智能核心语言Python\数据\病历数据.xlsx'
'''
若直接运行后的报错信息是:ImportError: Install xlrd>=0.90 for Excel support
意思为,缺少读取Excel文件的包xlrd
需用conda命令安装,在conda中输入以下安装包的命令即可:
conda install xlrd
'''
#读取excel文件里的数据
xl = pd.ExcelFile(fileNameStr)
'''
Excel里面可以有多个工作表(Sheet)
这里参入的参数值“Sheet1”,就是某个工作表的名称,而不是Excel的文件名。
我们可以打开Excel文件,会看到工作表(Sheet)对应的名称,默认的工作表名称是“Sheet1”(注意大小写)
你也可以修改这个工作表的名称,然后传入对应的名称,就会根据名称读取这个工作表里的数据了
注意这个名称如果是英文,注意大小写,我一般喜欢从Excel中复制这个名称过来,以防错误
'''
#获取指定工作表(Sheet)名称的数据
patientDf = xl.parse('Sheet1')
print(patientDf)
病人编号 姓名 年龄 糖尿病类型 病情
0 1 猴子 29 1型糖尿病 较差
1 2 马云 34 2型糖尿病 好转
2 3 王健林 28 1型糖尿病 显著好转
3 4 马化腾 52 2型糖尿病 较差
6.数据结构(collections包)
- 提高数据处理效率
- 可参考官网使用操作文档:https://docs.python.org/2/tutorial/datastructures.html#more-on-lists
from collections import deque
6.1 队列 queue
- 入队(尾部)
#定义队列:排队吃饭人的编号
queue=deque(['001','002','003','04','005'])
#入队:在队列尾部插入元素
queue.append('006')
print(queue)
deque(['001', '002', '003', '04', '005', '006'])
- 出队(头部)
#出队:在队列头部删除元素
queue.popleft()
'001'
print(queue)
deque(['002', '003', '04', '005', '006'])
6.2 栈 stack
eg.浏览器前进后退按钮
#定义栈:浏览我个人知乎主页的顺序
stack=deque(['知乎动态','知乎回答','知乎文章'])
print(stack)
deque(['知乎动态', '知乎回答', '知乎文章'])
- 入栈(顶部)
#入栈:在栈顶加入元素
stack.append('知乎专栏')
print(stack)
deque(['知乎动态', '知乎回答', '知乎文章', '知乎专栏'])
- 出栈(顶部)
#出栈:将栈顶元素移除
stack.pop()
'知乎专栏'
print(stack)
deque(['知乎动态', '知乎回答', '知乎文章'])
6.3 排序字典 OrderedDict
'''
OrderedDict:按照插入key的顺序,对字典排序
'''
from collections import OrderedDict
# 无序字典
# python现版本可有序(以前版本无序)
gafataDict={'腾讯':'H0700','亚马逊':'AMZN','Facebook':'FB',
'苹果':'AAPL','阿里巴巴':'BABA','谷歌':'GOOG'}
gafataDict
{'腾讯': 'H0700',
'亚马逊': 'AMZN',
'Facebook': 'FB',
'苹果': 'AAPL',
'阿里巴巴': 'BABA',
'谷歌': 'GOOG'}
#定义有序字典
gafataOdDict=OrderedDict({'谷歌':'GOOG','亚马逊':'AMZN','Facebook':'FB',
'苹果':'AAPL','阿里巴巴':'BABA','腾讯':'0700'})
gafataOdDict
OrderedDict([('谷歌', 'GOOG'),
('亚马逊', 'AMZN'),
('Facebook', 'FB'),
('苹果', 'AAPL'),
('阿里巴巴', 'BABA'),
('腾讯', '0700')])
6.4 计数器 Counter
'''
计数器:可统计词频
'''
from collections import Counter
cDict = Counter('有一种鸟是永远也关不住的,因为他们的羽毛太光亮了。羽毛太光亮')
cDict
Counter({'有': 1,
'一': 1,
'种': 1,
'鸟': 1,
'是': 1,
'永': 1,
'远': 1,
'也': 1,
'关': 1,
'不': 1,
'住': 1,
'的': 2,
',': 1,
'因': 1,
'为': 1,
'他': 1,
'们': 1,
'羽': 2,
'毛': 2,
'太': 2,
'光': 2,
'亮': 2,
'了': 1,
'。': 1})
cDict['亮']
2
#出现次数最多的3个词
cDict.most_common(3)
[('的', 2), ('羽', 2), ('毛', 2)]