Py学习  »  Python

R语言工作者入门python,你需要实际解决这三个问题

解螺旋 • 1 年前 • 169 次点击  
Hi,大家好,我是晨曦
今天这期推文我们开始进行python的相关学习,晨曦会把自己学习python中的一些感悟以及一些知识点通过推文的形式来和大家进行分享
本系列推文尤其适合有R语言基础的小伙伴,因为晨曦在学习python的时候,因为其与R的不同而导致晨曦的学习并不是十分的习惯
那么我们开始吧

一、引言

关于python的一些背景知识,其相关的内容在网络上都可以找到很多补充,比如:python创始人的头发是所有编程语言创始人头发中最长的、python是现在最流行的编程语言、python很简单等等,我们直接切入主题,首先来解决第一个问题:

问题一:适合R语言工作者的python解释器是什么?
简单理解,python解释器与python的关系,就是R和Rstudio的关系
在回答这个问题之前,肯定有很多学习过python的小伙伴会说,啊,那一定是jupyternotebook(方便快捷),不,你说的不对,一定是Pycharm(专业高效),这里说一下笔者的选择,因为笔者有一定R语言的基础,所以想找到一款解释器跟Rstudio 的界面高度相似,或者更进一步说是不需要额外设置就可以高度相似,那么很显然spyder更满足笔者的需求,界面如下:
可以很清楚地看到spyder具有笔者认为的以下优势
1.具有与Rstudio相似的界面;
2.具有变量空间,也就是说能够清楚地看到程序创建和删除变量的一系列状态
3.功能相对简单和直观,目前来说使用人数最多以及功能最强大的解释器是pycharm,但是pycharm的功能强大导致其软件比较复杂,而且启动相比较于spyder慢,所以这里笔者依旧习惯使用spyder
那么,既然已经搭建好了软件环境,接下来我们需要继续学习python的一些有意思的知识

二、数据类型

笔者在刚接触python的时候,其实对数据类型并不是十分的注意,但是接受过一些报错的洗礼后,现在对于数据类型也是格外的注意,我们可以观察下面的代码:

#制作一个零钱转换器#大致含义就是输入多少钱,输入成本,然后得到最后找零#设计功能的思路其实可以简单分为三个步骤:获取输入数据→逻辑计算→输出结果count = input("请输入成本:")price = input("请输入价格:")print("给你找零:" + (price - count))
但是上述代码会直接报错,报错信息如下:
#TypeError: unsupported operand type(s) for -: 'str' and 'str'
那么很显然这个就是因为我们没有注意数据类型,这一点跟R其实是相同的,在python中其实也是有以下数据类型:
所以我们上述的代码应该修改为以下形式:
count = int(input("请输入成本:"))price = int(input("请输入价格:"))print("给你找零:" + str(price - count))
那么从这里我们就提炼出了python相较与R的第一组知识点:
1.在python中数据类型与R中相似
2.数据类型的转换也是通过函数来完成
然后我们接着继续

三、变量

内存 or 硬盘 or 浅拷贝 or 深拷贝

假设我们想要在R语言中创建一个变量并且给其赋值为另一个变量,然后修改其中一个变量,那么另一个变量是否会发生改变呢?
#R语言中list01 = list("汉堡", "面条")list02 = list01list01[1] = "包子"print(list02)
各位小伙伴可以思考一下,我在R中运行上述代码得到的list02是什么?
那么答案很显然,我修改list01并不会影响list02,所以我的list02应该还是("汉堡", "面条"),这块在笔者学习python之前其实理解为,这个相当于程序进行了一个拷贝,但是在学习python之后,笔者对于内存的概念进一步得到提升,那么我们下面来看一下在python中运行相似的代码会出现什么样的结果?
#python中list01 = ["汉堡", "面条"]list02 = list01list01[0] = "包子"print(list02)#['包子', '面条']

纳尼!居然修改了变量list01,变量list02也被修改了(在刚开始接触到这种情况的时候笔者也是凌乱了)
但是后续笔者也是查询了一些资料,所以对这一点进行讨论,在python中代码运行在内存之中,但是内存内只是运行数据而不是保留数据,所以当我们创建一个变量list01其实就是在内存空间中开辟了一个地方,然后python通过管理数据地址来管理数据,换言之变量直接联系的并不是数据本身而是存储数据的数据地址,那么list02 = list01其实就是把地址拷贝了一份,但是数据只有一份,所以我如果通过地址对数据进行修改,自然而然就会导致连接相同地址的变量都会发生改变,这种储存数据的形式可能就是python比R对于内存的优化更好的地方
因为如果和R类似,那么很显然创建两个相同的变量,那么内存自然就会被压榨,但是python通过这种形式可以帮助系统减少内存压力,但是问题又来了,我如果想把数据真正拷贝两份该怎么办?
#深拷贝list01 = ["汉堡", "面条"]list02 = list01list04 = copy.deepcopy(list01)#list04 = list01[:]list01[0] = "包子"print(list04)

那么这个时候我们可以通过使用切片或者深拷贝来完成数据复制的情况
总结一下就是:python中简单的变量与变量赋值,交换的其实就是数据地址,并不是数据本身,如果想要真正交换数据(两份),那么需要使用切片或者深拷贝(这块与R不同需要好好理解)

四、容器

在R中我们的容器(尽管可能不应该叫这个名字,但是为了和后续统一)可以被简单归纳为以下四种:
一般来说,我们最常使用的其实就是数据框,但是在python中容器也是有四种,但是我们需要换一种思路来学习
首先,python的容器包含:列表、字典、元组、集合
然后我们需要区分一个概念:可变容器和不可变容器
简单理解就是:可变容器在创建后还可以进行修改;不可变容器就是创建后不可以进行修改
那么可变容器包括:列表、字典、集合
那么不可变容器容器包括:元组
然后我们下面将会对每一个容器通过代码进行学习,但是在学习之前需要牢记下面的概念:
对于可变容器,需要学习的就是五个维度即创建、添加、定位、遍历、删除
对于不可变容器,需要学习的就是创建、定位、遍历
#首先是最常使用的容器——列表#由一系列变量组成的可变序列容器# 1. 创建# 写法1:列表名 = [数据1,数据2]# 姓名列表list_names = ["悟空", "唐三藏", "八戒", "沙僧"]# 年龄列表list_ages = [26, 23, 25, 16]
# 写法2:列表名 = list(可迭代对象)list_name = list("孙悟空")print(list_name) # ['孙', '悟', '空']
# 2. 添加# -- 追加:列表名.append(数据)list_names.append("小白龙")# -- 插入: 列表名.insert(索引,数据)list_names.insert(2, "哪吒")print(list_names) # ['悟空', '唐三藏', '哪吒', '八戒', '沙僧', '小白龙']
# 3. 定位# -- 索引:容器名[整数]# -- 读取element = list_names[-1]print(element) # 小白龙# -- 修改list_names[-1] = "二郎神"print(list_names) # ['悟空', '唐三藏', '哪吒', '八戒', '沙僧', '二郎神']# -- 切片:容器名[整数:整数:整数]# -- 通过切片读取,创建新列表(拷贝)names = list_names[:3]print(names) # ['悟空', '唐三藏', '哪吒']# -- 通过切片修改,遍历右侧数据,依次存入左侧.list_names[:3] = ["空空", "唐唐", "猪猪"]# list_names[:3] = 100 # 因为100不能被forlist_names[:3] = "孙悟空"print(list_names) # ['孙', '悟', '空', '八戒', '沙僧', '二郎神']
# 4. 遍历:操作容器每个元素# -- 方式1:for 元素 in 容器# 适用性:从头到尾依次读取for name in list_names: print(name)
# -- 方式2:for 索引 in range(开始,结束,间隔):# 适用性:非从头到尾依次读取# len(list_names) - 1 是 最大索引(总数-1)# -1 索引可以去到0# -1 倒序# 功能:倒序for i in range(len(list_names) - 1, -1, -1): print(list_names[i])
# 功能:修改for i in range(len(list_names)): # 文字长度是3的修改为None if len(list_names[i]) == 3: list_names[i] = Noneprint(list_names) # ['孙', '悟', '空', '八戒', '沙僧', None]
# 5. 删除# -- 方式1:根据元素删除 列表名.remove(元素)list_names.remove("八戒")
# -- 方式2:根据定位删除 del 容器名[索引或者切片]del list_names[0]del list_names[-2:]print(list_names) # ['悟', '空']

其实掌握最常用的列表以后,我们后续处理数据基本上都是以列表的形式来进行操作,如果我们把其和R进行比较,那么列表其实就是等同于R中的列表,简单来说就是一点:包罗万象
那么下面我们需要去学习的容器就是与之对应的不可变容器——元组
# 1. 创建# -- 元组名 = (元素1, 元素2, 元素3)tuple01 = (10, 20, 30)# -- 元组名 = tuple( 可迭代对象 )list01 = ["a", "b", "c"]tuple02 = tuple(list01)
# 2. 定位# -- 读取(索引/切片)print(tuple01[0]) # 10print(tuple01[:2]) # (10, 20)
# 3. 遍历for item in tuple01: print(item)
for i in range(len(tuple01) - 1, -1, -1): print(tuple01[i])
# 4. 特殊# 注意1:小括号可以省略tuple03 = 10, 20, 30# 注意2:如果元组中只有一个元素,必须有逗号tuple04 = (10,)

其实简单来说,元组和列表其实可以对比记忆,如果我们想要创建一个包罗万象可以随时修改的对象,那么很显然,列表可以符合我们的要求,但是如果我们想要创建一个包罗万象而且又要确保稳定,不会被随便修改的对象,那么自然就是元组
所以,对于可变和不可变,笔者的理解其实就是出于安全性的考虑,想象一下,如果你的银行卡账号相当于一个容器,那么你是想让其可变还是不可变,也就是说你想让它是列表还是元组呢?QAQ
那么最后再介绍一个常使用的容器——字典
# 1. 创建# -- { 键1:值1, 键2:值2 }dict_wk = {"name": "悟空", "age": 25, "sex": "女"}dict_xbl = {"name": "小白龙", "age": 23, "sex": "女"}# -- dict(  [(  ,  ),( , )]  )# 列表转换为字典的格式要求:列表元素必须能够"一分为二"list01 = ["八戒", ("ts", "唐僧"), [1001, "齐天大圣"]]dict01 = dict(list01)
# 2. 添加 字典名[键] = 值dict_wk["money"] = 100000print(dict_wk) # {'name': '悟空', 'age': 25, 'sex': '女', 'money': 100000}
# 字典不能使用 索引 切片# 3. 定位:字典名[键]# -- 读取print(dict_wk["name"])# 注意:如果没有键则报错# 解决:读取数据前,通过in判断.if "money" in dict_wk: print(dict_wk["money"])
# -- 修改(与添加数据语法相同)# 具有key为修改,没有key为添加dict_wk["name"] = "空空"print(dict_wk) # {'name': '空空', 'age': 25, 'sex': '女', 'money': 100000}
# 4. 删除 del 字典名[键]del dict_wk["sex"]print(dict_wk) # {'name': '空空', 'age': 25, 'money': 100000}
# 5. 遍历# 方式1:for 键 in 字典名称for key in dict_wk: print(key)
# 方式2:for 值 in 字典名称.values()for value in dict_wk.values(): print(value)
# 方式3:for 键,值 in 字典名称.items()for key,value in dict_wk.items(): print(key) print(value)

当然,笔者个人的分析经历来看,最常使用的其实就是列表以及元组,字典除非特定数据否则笔者很少会去使用
而且这里对于R语言学习者来说一定要摒弃一个概念就是R中列表的概念
在python中容器就是存储数据的,并没有像R中这样明确的结构
好,到这里,对于初学python的各位小伙伴在掌握了上述三个有意思的内容后,凭借着自己R语言的基础应该可以很顺利的完成python的入门,其实R和python都是编程工具,具有的思想很多都是统一的
后续笔者也会继续更新一些自己学习python的知识总结,以前的推文更多的都是分析层面,使用别人轮子的推文,后续也会考虑增多一些编程基础的内容,因为数据挖掘越来越火热了,也希望笔者的专栏可以帮助到各位入门的小伙伴

那么就到这里了
我是晨曦,我们下期再见


END

撰文丨晨   曦
排版丨三叶虫
编辑丨三叶虫

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/150377
 
169 次点击