Python学习之旅—Day03

---恢复内容开始---

前言

  前面两次博客对Python的安装以及相关基础内容进行了整理和介绍,本次博客内容主要专注于解决字符串,列表,元组,字典等四大数据类型的主要用法。涉及到的基本用法本文在此不再赘述,因此本篇博客主要整理和讨论一些重要,易混淆的知识点。希望能够让大家抓住重点,有针对性地掌握相关知识点。



1.字符串

  关于字符串所提供的一些方法,例如,去除空格,变化大小写等方法在此不再讨论。在这里大家需要关注一个比较重要的知识点,就是对原始字符串操作后会形成新的字符串,而且这两个字符串在内存中的地址值是不一样的。举例如下:

>>> name = "spark"
>>> id(name)
2847482279840
>>> name.title()
‘Spark‘
>>> id(name.title())
2847482280848

从上面的代码中可知原始字符串name的内存地址值为:2847482279840;对name调用title()方法,形成了新的字符串,其内存地址值为:2847482280848。很明显这是两个不同的字符串,原始字符串没有发生改变。如果想让原始字符串name的值为:Spark,必须在调用title()方法后,将值重新赋予给name.代码如下:

>>> name = "spark"
>>> id(name)
2455126570968
>>> name = name.title()
>>> id(name)
2455126571920
>>> name
‘Spark‘

从上面的代码中可知,我们将新生成的字符串name.title()再重新赋予给name,此时name的值由原来的spark变为现在的Spark,而且其内存地址值也改变了。所以大家平时在操作字符串时一定要有这样的概念,避免不必要的错误。



2.列表

我们可以将列表看作是一个可变的容器,里面可以存储各种不同的数据类型。例如,整型,字符串,元组,字典,布尔值等。比如我们定义一个列表,如下:

 li = [11, 22, 33, [123, "spark", True, [22, 33, 44]], False, (11, 22, 33), "kafka"]

   在列表中,我们要注意四点,下面来详细讨论下。

【001】 追加方法append()与插入方法insert()的使用与区别:

  append方法表示向列表末尾插入元素,我们只需在append方法的参数中传入我们想要插入的值即可。而insert方法表示在指定位置插入我们想要的元素,其方法需要传入2个参数,一个是位置索引,另一个是需要插入的值。而且插入的值可以是任意类型,因为列表本身就是一个大容器。我们可以看看如下的代码:

>>> li = [11, 22, 33, [123, "spark", True, [22, 33, 44]], False, (11, 22, 33), "kafka"]
>>> print(li)
[11, 22, 33, [123, ‘spark‘, True, [22, 33, 44]], False, (11, 22, 33), ‘kafka‘]
>>> li.append((11,22,33))
>>> print(li)
[11, 22, 33, [123, ‘spark‘, True, [22, 33, 44]], False, (11, 22, 33), ‘kafka‘, (11, 22, 33)]>>> li.insert(8,[11,22,33])
>>> print(li)
[11, 22, 33, [123, ‘spark‘, True, [22, 33, 44]], False, (11, 22, 33), ‘kafka‘, [11, 22, 33], [11, 22, 33], (11, 22, 33)]

【002】通过上面的例子可知,列表本身是一个变化的容器,当我们对列表进行增加,删除,修改时,这些操作会直接作用于原始的列表,我们一起来看看如下的代码,并结合列表在内存中的地址值进行分析:

>>> id(li)
2455126510408
>>> del li[3]
>>> print(li)
[11, 22, 33, False, (11, 22, 33), ‘kafka‘, [11, 22, 33], [11, 22, 33], (11, 22, 33)]
>>> id(li)
2455126510408

>>> li[6].insert(3,44)
>>> print(li)
[11, 22, 33, False, (11, 22, 33), ‘kafka‘, [11, 22, 33, 44], [11, 22, 33], (11, 22, 33)]
>>> id(li)
2455126510408

从上面的代码分析可知,当我们对列表进行增加,删除和修改时,会直接将操作用于原始列表,因此列表的内容会改变,但从始至终,列表li在内存中的地址值始终没有变化过。这点是与字符串的最大区别。

【003】关于列表中的第三点,我们需要注意的是,批量替换列表中的元素。同样我们结合具体代码来进行分析:

>>> name_list = ["spark", "hadoop", "cisco", "kafka"]
>>> print(name_list)
[‘spark‘, ‘hadoop‘, ‘cisco‘, ‘kafka‘]
>>> name_list[2:4] = ["hbase", "flink", "hive", "mapreduce", "mongodb"]
>>> print(name_list)
[‘spark‘, ‘hadoop‘, ‘hbase‘, ‘flink‘, ‘hive‘, ‘mapreduce‘, ‘mongodb‘]

由上面的代码可知,我们想替换原始列表name_list中的最后两个元素,直接采用切片的方式指定最后两个列表的索引,然后使用列表["hbase", "flink", "hive", "mapreduce", "mongodb"]

来进行替换。同时我们发现,当替换完最后两个元素后,新的列表还有其他元素,也一起被添加到name_list中,成为了name_list的新元素。我们再来看下,如果新添加的元素为字符串,会发生什么样的情形:

>>> name_list = ["spark", "hadoop", "cisco", "kafka"]
>>> name_list[2:4] = "hive"
>>> print(name_list)
[‘spark‘, ‘hadoop‘, ‘h‘, ‘i‘, ‘v‘, ‘e‘]
>>> name_list = ["spark", "hadoop", "cisco", "kafka"]
>>> name_list[2:4] = "林俊杰"
>>> print(name_list)
[‘spark‘, ‘hadoop‘, ‘林‘, ‘俊‘, ‘杰‘]
>>>

由上面的代码分析可知,当要插入元素为一个字符串,批量替换时,列表会自动将字符串进行切分,然后将每个字符作为一个元素插入到列表中。另外,在上例中,我们需要批量替换列表中索引位置为2和3的元素,但是如果替换的元素只有一个会发生什么样的情形,看如下代码:

>>> name_list = ["spark", "hadoop", "cisco", "kafka"]
>>> name_list[2:4] = ["hbase",]
>>> print(name_list)
[‘spark‘, ‘hadoop‘, ‘hbase‘]

从上面的代码中可知,当替换的元素个数小于被替换的元素个数时,只会将替换的元素替代原始被替换的元素。就像上面使用hbase替换cisco,而没有元素来替换kafak,所以最后列表元素变为:[‘spark‘, ‘hadoop‘, ‘hbase‘]。另外要注意,我们习惯将只有1个列表的元素写为["hbase",],虽然可以去掉列表中的逗号。但在Python中加一个逗号是约定俗成的,这点还请大家注意。



3.元祖

  我们可以将元组看作是一个不可变的容器,即其里面的元素值是不可变的。大家主要注意的是元组与列表的混合使用,我们来看一个例子:

>>> li = [11, 22, 33, [123, "spark", True, [22, 33, 44]], False, (11, 22, 33), "kafka"]
>>> print(li)
[11, 22, 33, [123, ‘spark‘, True, [22, 33, 44]], False, (11, 22, 33), ‘kafka‘]
>>> li[-2].append(22)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: ‘tuple‘ object has no attribute ‘append‘
>>>

从上面的代码可知,li[-2]的元素值是一个元组(11, 22, 33),当我们想对元组进行添加元素时会报错,这是因为元组中的元素是不可变的。我们再来看如下一个可能令大家困惑的例子:

>>> name_tuple = (1,2,3,[11,22,33])
>>> name_tuple[-1].append(44)
>>> print(name_tuple)
(1, 2, 3, [11, 22, 33, 44])

元组name_tuple的最后一个元素是一个列表,因此我们可以对列表进行添加元素,所以name_tuple[-1].append(44)可以执行成功。我们可以将li = [11,22,33],我们仅仅是对元组中的列表进行修改,而元组本身的元素并没有发生改变。这也是区别于上面例子的地方,希望大家能够好好体会。



4.字典

  我们可以将字典看作是键值对的集合,即字典中的元素是一个个的键值对。关于字典,我们需要主要如下几点:

【001】通过key来获取value元素:get方法。我们来看下面的例子:

>>> dict = {"k1": "v1", "k2": "v2"}
>>> dict.get(‘k1‘)
‘v1‘
>>> dict.get(‘k3‘)
>>> dict[‘k1‘]
‘v1‘
>>> dict[‘k3‘]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: ‘k3‘

从上面的代码中可知,当我们通过get方法根据key来获取value时,如果key不存在,返回值为None,它不会报错。但是使用dict[‘k3‘]获取value值时,如果key不存在,那么会报错。

【002】关于字典我们需要注意的第二点是嵌套。在实际项目中,我们往往有一系列的需求,例如将一系列字典存储在列表中,或者将列表作为值存储在字典中,甚至可以在字典中嵌套字典。我们可以通过如下的代码进行说明:

# 在列表中嵌套字典user_list = []
for user_number in range(1, 302):
    new_user = {‘user‘: ‘alex-%d‘ % user_number, ‘email‘: ‘alex%[email protected]‘ % user_number, ‘pwd‘: ‘pwd%d‘ % user_number}
    user_list.append(new_user)

上面代码演示了如何在列表中嵌套字典,列表的元素是一个一个的字典,如果我们想取出列表中的元素,可以使用如下的代码:

 for user in user_list[:10]:
            print(user)

下面我们接着来看如何在字典中嵌套列表:

favorite_language = {
    ‘alex‘: [‘python‘, ‘go‘],
    ‘sara‘: [‘c‘],
    ‘carson‘: [‘ruby,‘go‘],
    ‘tom‘: [‘java‘,‘python‘]
}

如上所示,我们在字典中嵌套了列表。每个被调查的人都与其关联一个语言列表。

以上就是列表中要注意的相关点,更多的知识需要各位在平时的练习中加以熟练,并结合实际需求来设计合理的数据结构!



本篇博客主要记录了字符串,元组,列表中的一些重点知识,希望能够对大家有帮助,达到夯实基础的目的。

  

  

  

---恢复内容结束---

时间: 2024-10-11 21:49:42

Python学习之旅—Day03的相关文章

180分钟的python学习之旅

最近在很多地方都可以看到Python的身影,尤其在人工智能等科学领域,其丰富的科学计算等方面类库无比强大.很多身边的哥们也提到Python非常的简洁方便,比如用Django搭建一个见得网站只需要半天时间即可,因此也吸引了我不小的兴趣.之前相亲认识过一个姑娘是做绿色环保建筑设计行业的,提过她们的建筑物的建模也是使用Python,虽然被女神给拒绝了,但学习还是势在必行的,加油. 这部分只涉及python比较基础的知识,如复杂的面向对象.多线程.通信等知识会放在之后的深入学习中介绍,因此整个学习过程也

我的Python学习之旅1

什么是Python? 可以理解为"一种解释型的.面向对象的.带有动态语义的高级程序设计语言" Python的发展,可以分成以下几个重要的阶段: ---CNRI时期:CNRI是资助Pyhon发展初期的重要单位,Python1.5版之前的成果大部分都在此时期内完成. ---BeOpen时期:Guido van Rossum与BeOpen公司合作,此期间将Python2.0推出,甚至Python1.6也同时问世,但 原则上已经分别维护了. ---DC时期:目前Guido已经离开BeOpen公

python学习之旅:array 转 list

最近学习python,记录学习的点滴. >>> import numpy as np >>> a = np.array([[1,2],[3,4]]) >>> b=a.tolist() >>> b [[1, 2], [3, 4]]

Python学习之旅—Day07(生成器与迭代器)

前言 本篇博客主要专注于解决函数中的一个重要知识点--生成器与迭代器.不管是面试还是工作,生成器与迭代器在实际工作中的运用可以说是非常多,从我们第一天开始学习for循环来遍历字典,列表等数据类型时,我们就已经和生成器,迭代器打交道了!本篇博客从最基础的基本概念,例如容器,可迭代对象,生成器,迭代器的概念,到for循环是怎么工作的娓娓道来.希望本篇博客能够帮助大家切实掌握生成器与迭代器的使用与底层原理. 一.容器 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in

Python学习之旅—Day06(字符串+字典+列表重点方法)

前言: 本篇博客主要针对字符串,字典和列表中的一些容易忽略的重点方法进行整理,以期进一步夯实大家的基础. [001]字符串方法--isspace()方法 isspace()方法主要检测字符串是否只由空格组成.我们通过如下的实际例子来查看该方法: str1 = " " print(str1.isspace()) str2 = "cisco 123" print(str2.isspace()) str3 = " #" print(str2.isspa

python学习之旅

一.入门 1.Python 面向对象编程 2.jquery入门 3.HTML+CSS基础入门 4.Javascript初步 5.Python语言编程基础 二.初级阶段 1.Git 与 GitHub 2.Python 爬虫基础 3.django进阶 4.django项目部署 5.ajax入门 6.django基础 7.Mysql基础 三.中级阶段  1.Linux基础 2.Python :socket and threading 3.使用pyqt开发windows gui程序及打包 4.Pytho

Python学习之路——day03

九.collection系统 先做个练习 练习一:元素分类有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中.即: {'k1': 大于66 , 'k2': 小于66} 1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 ''' 4 将一个数字列表分割成字典,'k1'的值为小于66的值,'k2'的值为大于66的值 5 '''

Python学习之旅—Django基础

前言  前段时间业务比较繁忙,没时间更新博客,从这周开始将继续为各位更新博客.本次分享的主题是Django的基础部分,涵盖Django MTV三部分,并通过一个简单的班级管理系统来说明如何使用Django进行开发,好啦,开始今天的主题吧! 一.浅谈MVC.MTV和MVVM 要学习Django,我们很有必要了解下MVC,MTV和MVVM三种模式. [001]MVC MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式(本文不讨论桌面应用的MVC),它把业务

Python学习之旅(三十八)

Python基础知识(37):访问数据库(Ⅱ) 因临近考试,本人即将进入复习阶段,从明天12月19号至2019年的1月二十多号暂停更新 二.MySQL MySQL是Web世界中使用最广泛的数据库服务器.SQLite的特点是轻量级.可嵌入,但不能承受高并发访问,适合桌面和移动应用.而MySQL是为服务器端设计的数据库,能承受高并发访问,同时占用的内存也远远大于SQLite. 可以直接从MySQL官方网站下载最新的Community Server 5.6.x版本. 由于Python的DB-API定义