123、Python基础入门总结
学习Python的秘诀:多敲代码 + 学会使用搜索引擎
一、搭建编程环境
工欲善其事,必先利其器,要想学习一门技能,先找到一样趁手的工具,我这里推荐两种:
1)侧重项目开发:Anaconda + PyCharm
参考的书籍《Python编程从入门到实践》、《父与子的编程之旅 与小卡特一起学Python》;更多的基础语法详见菜鸟python3教程 或Python 2基础教程 | 菜鸟教程,如果实在弄不懂如何搭建编程环境,也没关系,学习python最重要是实践,也可以先敲代码,我这里推荐一个python2.7的在线编程环境:https://www.tutorialspoint.com/execute_python_online.php 或者python3的在线编程环境:https://www.tutorialspoint.com/execute_python3_online.php
上面Python2和Python3只需要选一个来学就好。
2)侧重数据分析:Anaconda + Jupyter notebook
我下面都会使用Anaconda + Jupyter notebook,编程环境是python3,具体的安装方法我推荐猴子老师的<u>初学python者自学anaconda的正确姿势是什么??</u>和<u>jupyter notebook 可以做哪些事情?</u>,更多的基础语法详见<u>菜鸟python3教程</u>和参考的书籍《Python编程从入门到实践》、《父与子的编程之旅 与小卡特一起学Python》。
二、Python的四个关键点
1、数据的基本类型
数据类型有:字符串(String)、数字(Number)、容器、布尔(Booleans)、空值(None)
(1)字符串(String)
字符串:就是一系列字符。在Python中,用引号括起的都是字符串,其中的引号可以是单引号,也可以是双引号,如下所示: 1.png(2)数值(Number)
python3中常见的数字类型为int(整数),float(浮点数),bool(布尔值),complex(复数)。 2.png(3)容器
① 列表(List)
列表的优势在于有序且可以修改,方便查询、增加、修改和删减数据。 3.png② 元组(Tuple)
Python的元组与列表类似,不同之处在于元组的元素不能修改。
元组使用小括号,列表使用方括号。 4.png③ 集合(Sets)
集合是一个无序不重复元素的序列 5.png④ 字典(Dictionary)
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中。字典的好处就是它的每一个关键字都对应一个值,就像我们查英语字典一样。 6.png (4)布尔(Booleans)、空值(None) 7.png2、函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。
定义函数时使用def语句: 1.png 函数不可变的数据类型和可变数据类型实例: 2.png变量作用域:
Python的作用域一共有2种:全局作用域,局部作用域。
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。 3.png3、条件判断
条件判断中的核心都是一个值为True或False的表达式,这种表达式被称为条件测试,其主要应用就是筛选出我们要的结果,其执行过程如图所示: 1.png4、循环
循环有两种:for循环while循环,常用的语句是for循环语句。
三、类(Class)
类: 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 1.png四、模块和包
模块是扩展名为.py的文件,包含所有你定义的函数和变量的文件。模块可以被别的程序引入,以使用该模块中的函数等功能。
导入模块常用的一种导入方法:只需编写一条import语句并在其中指定模块名,就可在程序中使用该模块中的所有函数。
模块包括Python内置模块和第三方模块(或自己编写的模块),下面列出了我自己安装Python3的内置模块路径: 1.png下面的代码是导入第三方模块pandas的一个演示,我以读取存放在自己电脑
D:\Python\notebook 上的一个叫 B9 USB QV数据.xlsx的文件为例: 2.png五、常用数据结构
1、队列(queue)
队列就像在银行排队办理业务,新来的人在队列尾部加入,叫做入队。办理完业务的人从队列首部离开队列,叫做出队。
口诀:先入先出 1.png2、栈(stack)
栈就像储钱罐,往储钱罐里丢入一枚硬币,就是入栈,后面丢入的硬币总是在最上面。
口诀:先入后出 2.png3、排序字典OrderedDict
排序字典能够按照字典中插入key的顺序,对字典进行排序。 3.png4、计数器Counter
Counter(计数器):用于追踪值的出现次数。 4.png 从结果中可以看出,在统计出现次数最多的3个字时,原字符串中所有标点符号都属于字符串,因此也会计算在内,可以采用切片+拼接的方法,删除poem中的标点符号再来统计: 5.png附一张python****学习的脑图总结****:
python学习的脑图总结.jpg附源码:
# coding: utf-8
# # 字符串(String)
# In[1]:
# 定义字符串
nameStr = '我'
gameStr = '爱吃鸡游戏'
# 将字符串合并
print('使用+将字符串合并:',nameStr + gameStr)
# In[2]:
# 用%s格式化字符串
str = '我叫%s,我会%s,还喜欢%s' % ('马云','赚钱','拍电影')
print(str)
# # 数值(Number)
# In[3]:
# 1)整形:一天有24小时
day = 24
# 2)浮点型:我用微信支付9.9元
money = 9.9
# # 容器-列表(List)
# In[4]:
'''
容器:列表(List)
'''
# 定义列表:富豪榜
nameList = ['马化腾','马云','王健林','李彦宏']
# 列表的长度
nameLen = len(nameList)
print('富豪数目:',nameLen)
# In[5]:
#1)容器操作:增加元素
nameList.append('刘强东')
print('增加一个元素',nameList)
# In[6]:
#2)容器操作:删除元素
del nameList[2]
print('删除第三个元素:',nameList)
# In[7]:
#3)容器操作:查询:使用下标索引来访问列表中的值,下标从0开始
name1 = nameList[0]
print('查询第一个元素:',name1)
# In[8]:
#4)容器操作:修改:直接指定下标的值
print('修改前第一个元素是:',nameList[0])
nameList[0] = '王思聪'
print('修改后第一个元素是:',nameList[0])
# In[9]:
# 此时列表情况
print(nameList)
# # 容器-元组(Tuple)
# In[10]:
'''
容器:元组(Tuple)是一个不能修改值的列表,用小括号标识
'''
# 定义元组:一组人名
namesTuple = ('马云','马化腾','王健林')
# In[11]:
#1)访问单个元组元素
aTuple = namesTuple[2]
print('单个元组元素:',aTuple)
#2)使用for循环访问所有元组元素
print('\n所有元组元素:')
for allTuple in namesTuple:
print(allTuple)
# In[12]:
#3) 元组中的元素值是不允许修改的,如果修改将会报错
#namesTuple[2] = '王思聪'
#print(namesTuple)
# # 容器-集合(Sets)
# In[13]:
'''
容器:集合(Sets)是一个没有重复元素的容器
'''
# 定义集合:6家公司的股票
gafataSets = {'谷歌','苹果','Facebook','亚马逊','腾讯','阿里巴巴','阿里巴巴'}
print(gafataSets)
# In[14]:
#1)容器操作:增加
#定义一个空的集合
stockSets = set()
# 使用update增加元素
stockSets.update(['腾讯','阿里巴巴','京东'])
print(stockSets)
# In[15]:
#2)容器操作:使用discard删除
stockSets.discard('京东')
print(stockSets)
# In[16]:
#3)容器操作:查找
txBool='腾讯' in stockSets
print(txBool)
# In[17]:
#4)容器操作:修改
# 第1步:先删除
stockSets.discard('京东')
# 第2步:再添加
stockSets.update(['百度','京东'])
print(stockSets)
# # 容器-字典(Dictionary)
# In[18]:
'''
容器-字典(Dictionary)
'''
# 定义字典:点餐编号和姓名的映射关系
coffeeDic={'001':['马云',34,'拿铁','大杯'],
'002':['马化腾',52,'卡布奇诺','中杯'],
'003':['李彦宏',49,'摩卡','小杯'],
'004':['刘强东',43,'拿铁','中杯']}
# In[19]:
#1)容器操作:增加
coffeeDic['005']=['王思聪',30,'摩卡','中杯']
print(coffeeDic)
# In[20]:
#2)容器操作:删除
del coffeeDic['005']
print(coffeeDic)
# In[21]:
#3)容器操作:查询,根据点餐编号查询每个人喜欢的口味
valueList = coffeeDic['001']
print(valueList)
# In[22]:
#4)容器操作:修改
print('修改之前,点餐信息:',coffeeDic['003'])
coffeeDic['003']=['李彦宏',49,'摩卡','大杯']
print('修改之后,点餐信息:',coffeeDic['003'])
# In[23]:
print(coffeeDic)
# # 布尔类型
# In[24]:
age = 10
if age == 5:
print('判断条件为True')
else:
print('判断条件为False')
# # 空值None
# In[25]:
age = None
if age == None:
print('年龄是空值')
else:
print('年龄不是空值')
# # 条件判断案例
# In[1]:
# 《摔跤吧,爸爸》豆瓣评分
scoreNum=9.1
if scoreNum >=8:
print('我要看这部电影')
else:
print('电影太烂,不去看了')
# In[2]:
# 边界条件:逻辑判断
# 定义列表
nameList = ['王思聪','马云','王健林','马化腾']
if '王思聪' not in nameList:
print('列表中没有叫王思聪的人')
else:
print('列表中有个叫王思聪的人')
# In[3]:
# 多个条件判断
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)
# # 如何使用循环批量处理数据?
# # 案例1:抽查产品尺寸
# In[1]:
# 重复性工作
print('第1次抽查')
print('第2次抽查')
print('第3次抽查')
# In[2]:
# 使用for循环实现重复性工作
checkList = ['第1次抽查','第2次抽查','第3次抽查']
for i in checkList:
print(i)
# In[3]:
# 使用while循环
times = 1
while times < 4:
print('抽查次数:',times)
times += 1
# # 案例2:清洗GAFATA股票数据
# In[4]:
'''
定义字典:6家公司(GAFATA)的股票
key是公司名称,value是股票代码
'''
gafataDic = {'谷歌':'GOOGLE','苹果':'Apple','Facebook':'fb',
'亚马逊':'amzn','腾讯':'HK:00700','阿里巴巴':'baba'}
# 将股票代码全部大写
for key,value in gafataDic.items(): # items()返回一个键-值对列表
# 对股票代码转换成大写
newvalue = value.upper()
# 将转换后新的股票代码赋值给key
gafataDic[key] = newvalue
print(gafataDic)
# # continue用于跳出当前循环
# In[5]:
for key,value in gafataDic.items():
if(key=='苹果'):
continue # 停止key=='苹果'这一步,其他都执行
print('当前公司:',key,'当前股票代码:',value)
# # break用于退出整个循环
# In[6]:
# 查找苹果公司的股票代码
number = 0
for key,value in gafataDic.items():
number = number + 1
if (key == '苹果'):
print('查找',key,'公司的股票代码是:',value)
break
print('当前公司是:',key,'当前股票代码',value)
# # 如何自定义函数?
# In[1]:
'''
定义函数
函数的功能:求出两个数相乘的结果
输入:x,y是两个要相乘的数
输出:两个数相乘的积
'''
def mul(x,y):
z = x * y
return z
# # 如何使用函数?
# In[2]:
'''
由上面自定义函数可知:
只需要给函数add()提供两个参数,
即可求出它们的积
'''
a = 2
b = 3
c = mul(a,b)
print('2*3=',c)
# # 函数参数:不可变数据类型
# 字符串、数字,元祖这3种是不可变数据类型,其他的都是可变数据类型
# In[3]:
# 定义函数:改变数据的值
def changeIn(a):
a = a + 1
return a
'''
使用函数:
参数是不可变的数据类型(字符串、数字、元组)
传递的只是该数据类型的值(相当于复制一份)
'''
b = 1
print('调用函数之前b的值=',b)
c = changeIn(a=b)
print('调用函数之后b的值=',c)
# 从结果看出,调用函数前后的值虽然不同,但数据类型不变都是整形
# # 函数参数:可变数据类型
# In[4]:
# 定义函数:改变字典的值
def changeDic(inputDic):
inputDic['校花'] = ['奶茶妹妹']
return inputDic
'''
使用函数
参数是可变数据类型:
传递的是该变量的引用地址
'''
nameDic = {'阿里巴巴创始人':'马云','京东CEO':'刘强东'}
print('调用函数之前的字典:',nameDic)
changeDic(inputDic=nameDic)
print('调用函数之后的字典:',nameDic)
# # 变量作用域
# Python的作用域一共有2种:全局作用域,局部作用域。
# 定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。
# In[5]:
# 变量作用域
def aStr():
aStr = '他强任他强,清风拂山岗,他横任他横,明月照大江.'
numaStr = len(aStr) # len()统计字数
print(numaStr)
aStr() # aStr为全局变量
print(numaStr) # numaStr为局部变量,只能在函数aStr()内部使用
# ## 类的使用
# In[1]:
# 创建类
class User():
"""一次模拟问候用户的尝试"""
def __init__(self,name,sex,age):
"""初始化属性name,sex,age"""
self.name = name
self.sex = sex
self.age = age
def describe_user(self):
"""描述用户的方法"""
print(self.name + ' ' + self.sex + ' ' + str(self.age) + '岁')
def greet_user(self):
"""问候用户的方法"""
print(self.name + '您好!吃了么?')
# In[2]:
# 根据类创建实例并调用类的方法
ma = User('马云','男',54)
ma.describe_user()
# In[3]:
ma.greet_user()
# # 什么是模块
# # Python内置模块使用
# In[1]:
'''
Python内置模块
'''
# 第1步引入模块
import sys
# 使用模块中的函数、属性
pathList = sys.path
print('Python路径为: \n',pathList)
# # 第三方模块使用
# In[2]:
'''
使用第三方模块:pandas
pandas是数据分析工具
'''
# 引入模块
import pandas as pd
# In[3]:
#文件路径(在本地运行时替换成文件实际路径)
fileNameStr = 'D:\\Python\\notebook\\B9 USB QV数据.xlsx'
# In[4]:
'''
pandas的ExcelFile类支持读取存储在
Excel2003(或更高版本)中的表格型数据
通过parse读取到DataFrame
'''
# 导入excel文件
xl = pd.ExcelFile(fileNameStr)
sizeDf = xl.parse('Sheet1')
# In[5]:
print(sizeDf)
# ## 介绍Python的collections包,了解常用的数据结构
# ## 队列(queue)
# 队列就像在银行排队办理业务,新来的人在队列尾部加入,叫做入队。办理完业务的人从队列首部离开队列,叫做出队。
# 口诀:先入先出
# In[1]:
#导入collections包
from collections import deque
# In[2]:
# 定义队列:给排队的人编号
queue = deque(['001','002','003','004','005'])
# In[3]:
# 入队:新来一人在队尾排队
queue.append('006')
print(queue)
# In[4]:
# 出队:从队列头部删除一个元素
queue.popleft()
# In[5]:
# 此时队列的情况
print(queue)
# # 栈(stack)
# 栈就像储钱罐,往储钱罐里丢入一枚硬币,就是入栈,后面丢入的硬币总是在最上面。
# 口诀:先入后出
# In[6]:
# 定义栈: 浏览个人知乎主页顺序
stack = deque(['知乎动态','知乎回答','知乎文章'])
# In[7]:
# 入栈:在栈顶加入元素
stack.appendleft('知乎专栏')
print(stack)
# In[8]:
# 从栈底删除元素
stack.pop()
print(stack)
# # 排序字典OrderedDict
# In[9]:
'''
OrderedDict:按照插入key的顺序,对字典进行排序
'''
from collections import OrderedDict
# In[10]:
# 定义有序字典
gafataOrDic = OrderedDict({'谷歌':'GOOGLE','苹果':'Apple','Facebook':'fb',
'亚马逊':'amzn','腾讯':'HK:00700','阿里巴巴':'baba'})
gafataOrDic
# # 计数器Counter
# In[11]:
'''
计数器
'''
from collections import Counter
poem = '花舞花落泪,花开花瓣飞。花开为谁谢,花谢为谁悲。'
cDict = Counter(poem)
cDict['花'] # 统计'花'字出现了几次
# In[12]:
# 统计出现次数最多的3个字
cDict.most_common(3)
# In[13]:
# 采用切片+拼接的方法,删除poem中的标点符号
poem2 = poem[:5] + poem[6:11] + poem[12:17] + poem[18:23]
print('poem2: ',poem2)
# In[14]:
# 再统计出现最多的3个字
c2Dict = Counter(poem2)
c2Dict.most_common(3)