一、浮点数的计算

  • 思考1:打印结果是什么?
a = 0.1
b = 0.2
c = 0.3
print(b == a + a)
  • 思考2:打印结果是什么?
a = 0.1
b = 0.2
c = 0.3
print(c == a + b)

  是真的都返回True吗?让我们来看看结果:

  

  

  实际上,第一种a+a相当于a*2,所以结果为0.2,浮点数在python存储里面是不精确的,所以不能对浮点型数据直接进行精确计算,可以先转换为整数计算后在转化为浮点数即可,或者使用Decimal库来处理。

二、列表的复制

  • 思考:能够使用赋值的方式复制一个列表吗?
star_list = ['吴京', '徐峥', '黄渤', '杨幂']
star_list_copy = star_list

  答案是不能,我们可以通过对两个列表添加不同的值打印一下结果:

  

  为啥会这样呢?我们可以使用id()方法查看内存地址去判断是否为同一个列表:

  

  结果内存地址是一样的,因此列表不能用赋值的方法去进行复制,我们可以使用以下几种方法:

  • 使用for循环结合append方法遍历添加
star_list = ['吴京', '徐峥', '黄渤', '杨幂']

star_list_copy = []
for i in star_list:
star_list_copy.append(i) print(star_list_copy)
  • 使用extend方法一次性添加
star_list = ['吴京', '徐峥', '黄渤', '杨幂']

star_list_copy = []
star_list_copy.extend(star_list) print(star_list_copy)
  • 使用切片方法添加
star_list = ['吴京', '徐峥', '黄渤', '杨幂']

star_list_copy = star_list[:]

print(star_list_copy)
  • 使用copy内置方法添加
star_list = ['吴京', '徐峥', '黄渤', '杨幂']

star_list_copy = star_list.copy()

print(star_list_copy)

三、多继承的深度优先和广度优先

  • 思考1:打印结果是什么?
class A:
def run(self):
print('a is 吴京') class B(A):
pass class C():
def run(self):
print('c is 徐峥') class D(B, C):
pass D().run()

思考2:打印结果是什么?

class A:
def run(self):
print('a is 吴京') class B(A):
pass class C(A):
def run(self):
print('c is 徐峥') class D(B, C):
pass D().run()

  问题1,D同时继承了B和C,B又继承了A,在B这条继承上是D->B->A,在C这条继承上是D->C,相当于一个V字形,这个就是典型的V型问题,它采用的是深度优先原则,打印结果为:a is 吴京

  问题2,D同时继承了B和C,B和C都继承了A,在B这条继承上是D->B->A,在C这条继承上是D->C->A,相当于一个菱形,这个就是典型的菱形问题,它采用的是广度优先原则,打印结果为:c is 徐峥

  以上两种情况使用的是python当中的C3算法来实现的,我们可以使用一种简单的方法来获取他的顺序,即调用__mro__魔术方法

  

四、列表的清空

  • 思考1:打印结果是什么?
star_list = ['吴京', '徐峥', '黄渤', '杨幂']

for i in star_list:
star_list.remove(i) print(star_list)
  • 思考2:打印结果是什么?
star_list = ['吴京', '徐峥', '黄渤', '杨幂']

for index, value in enumerate(star_list):
star_list.pop(index) print(star_list)

  列表被清空了吗?没有,让我们先看看结果:

  

  

  原因是列表本质上是可被修改的,通过for循环,每次删除一个值后,列表就会发生改变,所以不要使用for循环去清空列表的值,建议使用clear方法:

  

五、列表的 +=

  • 思考1:打印结果是什么?
a = [1]
a_id = id(a) a += [2] a_id_new = id(a) print(a_id == a_id_new)
  • 思考2:打印结果是什么?
a = [1]
a_id = id(a) a = a + [2] a_id_new = id(a) print(a_id == a_id_new)

  我们先来看结果:

  场景1:

  

  场景2:

  

  结果却不一样,实际上在列表里面,+=相当于调用了列表的extend方法,仍然还是原来的列表,内存地址没有发生变化,第二种实际上是赋值操作,创建了一个新的列表,所以内存地址发生了改变

六、== 和 is

  • 思考:打印结果是什么?
a = [1]
b = [1] print(a == b)
print(a is b)

  都打印为True吗?不是,先看看实际结果:

  

  判断列表的时候:

    • == 比较的是 value(值)是否相等
    • is 比较的是 id 是否相同,也即两对象是否指向的同一块内存空间

  但是对于数字型或者字符串类型,它们却是一样的。

七、列表的扁平化、列表降维

  • 思考:如何将如下的一个列表降维?
star_list = [['吴京', '徐峥'], ['黄渤', '杨幂'], ['甄子丹', '章子怡']]

  提供了如下几种方法进行降维操作:

  • for循环

  

  • 列表推导式

  

  • sum方法

  

八、列表的可变性

  • 思考:打印结果是什么?
def add_movie(movie, movies=[]):
movies.append(movie)
return movies print(add_movie('战狼2'))
print(add_movie('流浪地球', []))
print(add_movie('哪吒'))

  先看结果:

  

  第一个打印和第二个打印都使用的是默认参数列表,所以内存地址没有发生变化,每次增加的值都是在原先的基础上添加值,第二个打印重新传入了一个空列表,此时创建了一个新的列表,内存地址发生了变化,因此它们不是一个列表

踩过了这些坑,你真的懂python基础吗?的更多相关文章

  1. 你真的懂JavaScript基础类型吗

    夯实Javascript基础. 基本类型有六种: null,undefined,boolean,number,string,symbol. 基本类型的值是保存在栈内存中的简单数据段 基础类型特性 基础 ...

  2. 你真的懂Python命名吗?

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/7417a7f0.html 大家好,我是测试蔡坨坨. 今天,我们来聊一下Python命名那些事儿. 名为万物之始,万物始于无名 ...

  3. 你真的会python嘛?

    前言 我这个博客一直都是一些技术分享,show code的地方,我从来没有写过个人生活或者情感杂谈,当然我也从来没有谈论过我对什么东西的喜恶. 很多人喜欢喷XX语言,喜欢谈论XX和YY的优缺,甚至凑了 ...

  4. 三分之一的程序猿之社交类app踩过的那些坑

    三分之一的程序猿之社交类app踩过的那些坑 万众创新,全民创业.哪怕去年陌生人社交不管融资与否都倒闭了不知道多少家,但是依然有很多陌生人社交应用层出不穷的冒出来.各种脑洞大开,让人拍案叫起. 下面我们 ...

  5. 与webview打交道中踩过的那些坑

    随着HTML5被越来越多的用到web APP的开发当中,webview这一个神器便日渐凸显出重要地位.简要的说,webview能够在移动应用中开辟出一个窗口,在里面显示html页面,css以及js代码 ...

  6. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  7. 【Fine原创】JMeter分布式测试中踩过的那些坑

    最近因为项目需要,研究了性能测试的相关内容,并且最终选用了jmeter这一轻量级开源工具.因为一直使用jmeter的GUI模式进行脚本设计,到测试执行阶段工具本身对资源的过量消耗给性能测试带来了瓶颈, ...

  8. 美团在Redis上踩过的一些坑-目录(本人非美团)(转)

    来自:http://carlosfu.iteye.com/blog/2254154 分为5个部分:    一.周期性出现connect timeout    二.redis bgrewriteaof问 ...

  9. 安装python爬虫scrapy踩过的那些坑和编程外的思考

    这些天应朋友的要求抓取某个论坛帖子的信息,网上搜索了一下开源的爬虫资料,看了许多对于开源爬虫的比较发现开源爬虫scrapy比较好用.但是以前一直用的java和php,对python不熟悉,于是花一天时 ...

随机推荐

  1. 012.MongoDB读写分离

    一 读写分离概述 1.1 读写分离描述 从应用程序角度来看,使用Replica Set 和使用单台mongo很像.默认的驱动程序会连接primary节点,并且将所有读写请求都路由到主节点.但也可以通过 ...

  2. 如何清除Mac上的空间,让Mac更有效地运行

    清理Mac上的空间通常被认为是一件必须要做的事情.因为这样,Mac将在驱动器上具有更多可用空间,从而可以更好地运行,并且您(以及系统和各种应用程序)可以根据需要利用额外的空间. 您可能会问的一个问题是 ...

  3. 带有Spring Boot和MySQL的Docker:简介(Part 1)

    通过优锐课java学习分享中,我们看一下带有Spring Boot和MySQL的Docker教程.非常实用,分享给大家参考学习. Docker是一种技术,开发人员或DevOps团队可以使用容器来构建, ...

  4. Docker-Nginx,发布前端服务

    1.安装环境: yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 yum-config-manager \ --add-r ...

  5. Dubbo学习笔记-Zookeeper连接失败

    1. 检查服务器的zookeeper端口是否开放,默认为2181 2. 检查zookeeper是否运行成功 # 进入bin文件夹 cd /usr/local/zookeeper/bin # 重启 zk ...

  6. 第一个月.day1

    1. 编辑器下载 推荐的是hbulider     开发环境 2. 浏览器 推荐chrome 谷歌浏览器学习 3. 建立技术笔记 推荐博客园 Web 本月任务 搭建静态网页. 静态页面:不需要网络请求 ...

  7. 如何开启php错误日志

    nginx与apache不一样,在apache中可以直接指定php的错误日志,那样在php执行中的错误信息就直接输入到php的错误日志中,可以方便查询. 在nginx中事情就变成了这样:nginx只对 ...

  8. CBrother脚本10分钟写一个拯救“小霸王服务器”的程序

    CBrother脚本语言10分钟写一个拯救“小霸王服务器”的程序 到了一家新公司,接手了一坨c++服务器代码,到处内存泄漏,这服务器没有数据库,挂了后重启一下就好了,公司就这么凑活着用了几年了,定时重 ...

  9. c++ LeetCode (网易面试题和链表以及树篇) 五道算法例题代码详解(三)

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11209807.html 一.1道网易c++的面试题 我当时第一时间的解答方案 #include ...

  10. Java分布式系统---消息中间件

    简介 消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信.当下主流 ...