python中可变参数的可变数据类型有哪些呢?

微信公众号:萝卜大杂烩
关注可了解更多的原创内容。问题或建议,请公众号留言或加本人微信;如果你觉得文章对你有帮助,欢迎加微信交流

从今天开始,陆续更新一些 相关的面试题,在学习的路上,与君共勉,我的文采好棒哦!

(黑人问号)WTF,喜欢学,爱咋咋地。

编译型语言:把做好的源程序全部编译成二进制的可运行程序。然后,可直接运行这个程序。如:C,C++
解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!如:Python,
(Java 有些特殊,java程序也需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后用解释方式执行字节码。)

字符串(str):字符串是用引号括起来的任意文本,是编程语言中最常用的数据类型。
列表(list):列表是有序的集合,可以向其中添加或删除元素。
元组(tuple):元组也是有序集合,但是是无法修改的。即元组是不可变的。
字典(dict):字典是无序的集合,是由 key-value 组成的。
集合(set):是一组 key 的集合,每个元素都是唯一,不重复且无序的。

可以用来连接字符串,将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串。

切割字符串,得到一个列表。

del:根据下标进行删除
pop:删除最后一个元素
remove:根据元素的值进行删除

sort:是将list按特定顺序重新排列,默认为由小到大,参数 reverse=True 可改为倒序,由大到小。

使用 pop 方法来指定删除字典中的某一项

用于创建一个新字典,以序列中元素做字典的键,value 为字典所有键对应的初始值

计算机在最初的设计中,采用了8个比特(bit)作为一个字节(byte)的方式。一个字节能表示的最大的整数就是255(二进制=十进制255),如果要表示更大的整数,就必须用更多的字节。
最早,计算机只有 ASCII 编码,即只包含大小写英文字母、数字和一些符号,这些对于其他语言,如中文,日文显然是不够用的。后来又发明了Unicode,Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。UTF-8 是隶属于 Unicode 的可变长的编码方式。

== 是比较操作符,只是判断对象的值(value)是否一致,而 is 则判断的是对象之间的身份(内存地址)是否一致。对象的身份,可以通过 id() 方法来查看。

可以看出,只有 id 一致时,is 比较才会返回 True,而当 value 一致时,== 比较就会返回 True

位置参数,默认参数,可变参数,关键字参数

允许我们在调用函数的时候传入多个实参

  1. 尽量以免单独使用小写字母'l',大写字母'O',以及大写字母'I'等容易混淆的字母。

  2. 函数命名使用全部小写的方式,可以使用下划线。

  3. 常量命名使用全部大写的方式,可以使用下划线。

  4. 不要在行尾加分号, 也不要用分号将两条命令放在同一行。

  5. 不要使用反斜杠连接行。

  6. 顶级定义之间空2行, 方法定义之间空1行,顶级定义之间空两行。

  7. 如果一个类不继承自其它类, 就显式的从object继承。

  8. 内部使用的类、方法或变量前,需加前缀'_'表明此为内部使用的。

  9. 要用断言来实现静态类型检测。

能够看出,浅拷贝只成功”独立“拷贝了列表的外层,而列表的内层列表,还是共享的

深拷贝使得两个列表完全独立开来,每一个列表的操作,都不会影响到另一个。

通过运行结果,可以看出 i 的取值为3,很神奇

print 函数,默认是会换行的,其有一个默认参数 end,如果像例子中,我们把 end 参数显示的置为"",那么 print 函数执行完后,就不会换行了,这样就达到了九九乘法表的效果了。

filter 函数用于过滤序列,它接收一个函数和一个序列,把函数作用在序列的每个元素上,然后根据返回值是True还是False决定保留还是丢弃该元素。

map 函数传入一个函数和一个序列,并把函数作用到序列的每个元素上,返回一个可迭代对象

reduce 函数用于递归计算,同样需要传入一个函数和一个序列,并把函数和序列元素的计算结果与下一个元素进行计算。

可以看出,上面的三个函数与匿名函数相结合使用,可以写出强大简洁的代码。

match()函数只检测要匹配的字符是不是在 string 的开始位置匹配,search()会扫描整个 string 查找匹配

__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候。是一个实例方法。

1、__new__至少要有一个参数 cls,代表当前类,此参数在实例化时由 Python 解释器自动识别。
2、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以 return 父类(通过 super(当前类名, cls))__new__出来的实例,或者直接是 object 的__new__出来的实例。
4、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过 return 语句里面调用的__new__函数的第一个参数是 cls 来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。

zip() 函数将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表

开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的 f.open 写法,我们需要 try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行 finally f.close() 关闭文件,with 方法帮我们实现了 finally 中 f.close。

Python 中默认是贪婪匹配模式。
贪婪模式:正则表达式一般趋向于最大长度匹配。
非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配。

默认参数是一个列表,是可变对象[],Python 在函数定义的时候,默认参数 L 的值就被计算出来了,是[],每次调用函数,如果 L 的值变了,那么下次调用时,默认参数的值就已经不再是[]了。

二分查找算法也称折半查找,基本思想就是折半,对比大小后再折半查找,必须是有序序列才可以使用二分查找。

read 读取整个文件
readline 读取下一行,使用生成器方法
readlines 读取整个文件到一个迭代器以供我们遍历

_foo:一种约定,用来指定变量私有。不能用 from module import * 导入,其他方面和公有变量一样访问。

__foo:这个有真正的意义:解析器用_classname__foo 来代替这个名字,以区别和其他类相同的命名,它无法直接像公有成员一样随便访问,通过对象名._类名__xxx 这样的方式可以访问。

a. 同时支持单继承与多继承,当只有一个父类时为单继承,当存在多个父类时为多继承。
b. 子类会继承父类所有的属性和方法,子类也可以覆盖父类同名的变量和方法。
c. 在继承中基类的构造(__init__())方法不会被自动调用,它需要在其派生类的构造中专门调用。
d. 在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别于在类中调用普通函数时并不需要带上 self 参数。

super() 函数是用于调用父类(超类)的一个方法。

主要分为实例方法、类方法和静态方法

定义:第一个参数必须是实例对象,该参数名一般约定为“self”,通过它来传递实例的属性和方法(也可以传类的属性和方法);
调用:只能由实例对象调用。

定义:使用装饰器@classmethod。第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法);
调用:实例对象和类对象都可以调用。

定义:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法;
调用:实例对象和类对象都可以调用。

静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互。即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。
类方法是将类本身作为对象进行操作的方法。他和静态方法的区别在于:不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来。

isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。

单例模式:主要目的是确保某一个类只有一个实例存在。
工厂模式:包涵一个超类,这个超类提供一个抽象化的接口来创建一个特定类型的对象,而不是决定哪个对象可以被创建。

面试题系列第一部分旧到这里了,我们下次见!

满满的干货,整理的这么辛苦,老铁们怎么也要给个“在看”吧!


欢迎关注,查看更多原创文章

}

python中不可变数据类型的定义为:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,就称不可变数据类型,包括:int(整型)、string(字符串)、tuple(元组)

首先我们来看一下整型为什么是不可变数据类型。给一个变量x赋值,然后改变这个x的值,输出前后两次的内存地址id和数据类型type

  • id():获取对象的内存地址
  • type():当只有一个参数的时候,返回对象的类型。当有三个参数的时候返回一个类对象。
# 打印x的内存地址和数据类型 # 打印改变后的x的内存地址和数据类型

从上面的代码我们可以得出,变量x为整型,且当x的值发生改变的时候,变量的内存地址也发生了改变。所以整型是不可变的数据类型。

根据上面的实例,我们把变量x的值换成字符串试试,看能不能得出字符串是不可变数据类型的结论呢~

# 打印x的内存地址和数据类型 # 打印改变后的x的内存地址和数据类型

代码中当变量改变时,变量的内存地址由 变为了 。所以字符串是不可变数据类型。

元组被称为只读列表,即数据可以被查询,但不能被修改。如果我们强行修改元组中的数据,会报错。

python中对可变数据类型的定义为:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,就称可变数据类型。包括:set(集合)、list(列表)、dict(字典)

我们先来看一下集合,定义一个集合set1,改变set1的值,且输出两次的内存地址

# 给set1添加一个元素

从上面代码我们可以看出,即使一个集合发生了改变,这个集合的内存地址是不变的。所以集合是可变数据类型。

当列表中的值发生了改变时,内存地址依旧不变,所以列表是可变数据类型。

字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。字典中的key值必须是可哈希的数据类型,也就是整型,字符串,元组等。

从上面代码可以看出,当字典中的元素发生改变时,内存地址不变,都是。所以字典是可变数据类型。

}

Python中,一切皆对象。

对象是分配的一块内存,有足够的空间去表示它们所代表的值。

  • 不可变对象:不支持原地修改。一旦修改,便是创建了一个新对象。
  • 可变对象:支持原地(in-place)修改。不改变原对象。

变量是指向对象的一个引用。变量只是一个临时标签,没有类型。

共享引用:多个变量引用了同一个对象。共享引用下,不可变对象和可变对象的差别比较大。

不可变对象不允许对自身内容进行原地修改。

对一个不可变对象进行赋值,实际上是创建一个新对象,再让变量指向这个新对象。

实例化新对象,开辟新内存空间,产生新地址。对象的id改变。

# 整数int 不支持原地修改自身,修改的本质是变量重新被创建并引用了新的对象。id改变。

可变对象则可以对自身内容进行原地 (in-place) 修改。

对一个可变对象赋值,实际上是使其内容原地 (in-place)修改,没有返回值。

不开辟新的内存空间,地址不变。对象的id不变。

# 列表 l 原地修改其自身,其 id 并未改变。

共享引用:多个变量引用了同一个对象。

不可变对象的共享引用中:

由于不可变对象本身不可原地修改,当多个变量共同引用同一对象时,

若一个变量改变引用,即创建新对象,新建引用,

其他变量引用的原对象不变。

#变量a和b,同时引用了同一个对象,该对象的值为整数257 # 因为整数属于不可变对象的类型,所以当变量 a 引用 'spam'时/给变量赋值为'spam'时, 相当于创建了不可变对象'spam',变量 a 去引用这个新对象。变量 b 还引用原对象的值 257。


可变对象的共享引用中:

由于可变对象本身支持原地修改,当多个变量共同引用同一对象时,

若可变对象本身原地被修改,该对象id不变,

多个变量同时引用的该对象本身,所以多个变量引用的值都改变。

原地修改 != 重新赋值

原地修改 != 重新赋值

原地修改 != 重新赋值

重新赋值,不可变对象和可变对象,因为新建对象,所以id都会改变。

对象的头部信息含有:类型标识符,自动识别类型。(可变和不可变数据类型,表述不准确。)

赋值语句:是把"="左边的变量名,绑定到"="右边的新建的对象/表达式中。

关于赋值"=",不可变对象和可变对象,无差别。

都是重新创建对象,变量去指向新的对象。

identity是对象身份的唯一识别标识符,调用id()函数查看。

#不可变对象int赋值为例:
# 变量名 a 重新赋值后,对象 id 改变,即变量引用对象的内存空间发生了变化。
#可变对象list赋值为例:
# 变量名 L1 重新赋值后,对象 id 改变,即变量引用对象的内存空间发生了变化。


对象的值相同,但是不是同一对象。

# 不可变对象int为例:
#可变对象list赋值为例:
# 不同对象引用的值相同,但是变量引用的对象不同,id不同。
# 小整数和短字符串例外:
# 实际在python中,[-5,256]的整数和短字符串有缓存池,以便于重复利用,所以id会不变。
}

我要回帖

更多关于 python中可变参数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信