大部分人都会忽略的Python易错点总结

枫铃3年前 (2021-07-10)Python243

python中复数实现(-2) ** 0.5和开根号sqrt(-2)的区别

(-2)**0.5和sqrt(-2)是不同的,前者是复数后者是会报错的。

print((-2)**0.5)
#输出:(8.659560562354934e-17+1.4142135623730951j)

import math
math.sqrt(-2)#报错
ValueError: math domain error

Python用循环构造的函数数组,运行这个数组里面的函数后返回值都一样

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
functions = []
for i in range(5):
    def f(x):
      return x + i
    functions.append(f)

for f in functions:
    print(f(7))

上面程序的输出是:

11
11
11
11
11

为什么明明f(x)返回的是x+i,而i是从0到4变化的。按道理执行f(x)后的返回值也应该是变化的,为何我们执行f(x)后是5个一样的值。

答:这是因为python中函数保存的外面的变量都是存储的是地址。也就是说x+i中的i是地址,循环执行完成后。i这个地址的值变成了4.所以最后执行f(7)就是一直是11==7+4.
不信你可以输出id(i)试试。

注意: Python取变量的地址的方法是id(变量名)。

Python数组列表list中extend()和append()的区别

代码举例说明

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
x = [1,2,3]
print(x.extend([2,3,4]))
"""
输出:
[1,2,3,2,3,4]
"""
print(x.append([2,3,4]))
"""
输出:
[1,2,3,[2,3,4]]
"""

可以看到:

  • extend()是把参数通过合并的形式融合到原来的列表里面。(融合)
  • append()是把参数当做一个元素加到原来列表里面。(吞并)

Python类变量,类名取变量(className.x)和self取变量(self.x)之间的区别?

  1. 类名取变量 和 self取变量它们初始值的地址是完全一样。 (意味着值也一样)
  2. 用类名取变量不会影响他们变量的地址。(以为着用类名取变量并且修改变量使得两种取变量的方式值都发生变化)
  3. 但是用self取变量方式修改变量就会使得它们地址变得不一样。(这意味着修改self取的变量只会影响self取变量这种方式的值,不会影响类名取变量方式的值)

看代码理解这3句话:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Car:
  color = 'gray'
  def describe_car(self):
    return  Car.color 
  def describe_self(self):
    return  self.color 
 
test = Car()
# 类名取Car.color和self.color初始值是一样的.因为此时他们的地址是完全一样的.
print(test.describe_car()) #输出:gray 
print(test.describe_self()) # 输出:gray 
print('Carcolor地址:',id(Car.color),'self.color地址:',id(test.color))#你可以看看地址是否相同

# 先修改Car.color会影响self.color。因为此时他们的地址是完全一样的
Car.color = 'red'
print(test.describe_car()) #输出:red
print(test.describe_self()) # 输出:red
print('Carcolor地址:',id(Car.color),'self.color地址:',id(test.color))#你可以看看地址是否相同

# 修改self.color不会影响Car.color,因为此时他们地址变得不一样了。
test.color = 'blue'
print(test.describe_car()) #输出:red
print(test.describe_self()) # 输出:blue
print('Carcolor地址:',id(Car.color),'self.color地址:',id(test.color))#你可以看看地址是否相同

# 经过上一步此时他们两地址不一样了。修改Car.color不会影响self.color。因为此时他们的地址是不一样的
Car.color = 'black'
print(test.describe_car()) #输出:black
print(test.describe_self()) # 输出:blue
print('Carcolor地址:',id(Car.color),'self.color地址:',id(test.color))#你可以看看地址是否相同

tuple元组不可以修改元素,这是元组和List列表的区别之一

x = (0,1,2)
x[0]=-1#这是错误的会报错
TypeError: 'tuple' object does not support item assignment

Python魔法方法magic method,变量的顺序问题

__mul__(self,other),调用这个魔术方法是self*other,它实际这这样执行的:self.__mul(other)

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。