Python语言特性

1. Python的函数参数传递

​看两个如下例子,分析运行结果

#代码1

a = 1

def fun(a):

a = 2

fun(a)

print(a) #1

#代码2

a = []

def fun(a):

a.append(1)

fun(a)

print(a) #[1]

所有的变量都可以理解为内存中的一个对象的引用,或者也可以看似C中void*的感觉。

这里记住的是类型是属于对象的,而不是变量的。而对象有两种,可更改(mutable)与不可更改(immutable)对象。在python中,str、tuple、int是不可更改的对象,而list、dict等则是可以修改的对象。

当一个引用传递给函数的时候,函数自动复制一份引用,这个函数的引用和外边的引用没有半毛钱关系,所以第一个例子里函数把引用指向一个不可更改的对象,当函数返回的时候,外面的引用没感觉,而第二个例子就不一样,函数内部的引用指向的是可变对象,对它的操作就和定位了指针地址一样,在内存里进行修改。

2.Python中的元类【metaclass】

​元类就是创建类的东西。创建类就是为了创建类的实例对象,但是我们已经学习到了python中的类也是对象。元类就是用来创建这些类(对象)的。元类就是类的类。

3.静态方法@staticmethod和类方法@classmethod

Python其实有3个方法,分别是静态方法、类方法、实例方法。

class A(object):

def foo(self,x):

print("saada%s"%(self,x))

@classmethod

def class_foo(cls,x):

print("asdsad%s"%(cls,x))

@staticmethod

def static_foo(x):

print("adad%s"%(x))

a = A()

先理解函数参数里面的self、cls 这个self和cls是类或者实例的绑定,对于实例方法,我们知道在类里每次定义方法的时候都需要绑定这个实例,就是foo(self,x),为什么要这么做呢?因为实例方法的调用离不开实例,我们需要把实例自己传给函数。调用的时候是这样的a.foo(x)其实foo(a,x)类方法一样,只不过它的传递是类而不是实例A.class_foo(x),注意这里的self和cls可以替换别的参数。

对于静态方法其实和普通方法一样,不需要对谁进行绑定,唯一的区别是调用的时候使用a.statis_foo(x)或者A。static_foo(x)来调用。

\

实例方法

类方法

静态方法

a = A()

a.foo(x)

a.class_foo(x)

a.static_foo(x)

A

不可用

A.class_foo(x)

A.static_foo(x)

4.类变量和实例变量

class Person:

name = 'aaa'

p1 = Person()

p2 = Person()

p1.name = 'bbb'

print(p1.name)#bbb

print(p2.name)#aaa

print(Person_name)#aaa

类变量就是供类使用的变量

实例变量就是供实例使用的变量

这里的p1.name = ‘bbb’是实例调用了类变量,者其实和上面第一个问题一样,就是函数传参的问题,p1.name一开始是指向类变量name=‘aaa’,但是在实例作用域里类变量的引用改变了,就变成了一个实例变量。self.name,不再引用Person的类变量name。

#例子

class Persson:

name = []

p1 = Person()

p2 = Person()

p1.name.append(1)

print(p1.name)#[1]

print(p2.name)#[1]

print(Pseron.name)#[1]

5.Python自省

这属于python彪悍的特性。

自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型,简单一句就是运行的时候能够知道对象的类型,比如:type、dir、getattr、hasattr、isinstance。

6.字典推导式

d = {key:value for (key,value) in iterable}

7.Python中单下划线和双下划线

class MyClass():

def __init__(self):

self.__superprivate = 'Hello'

self._semiprivate = 'world'

mc = MyClass()

print(mc.__superprivate)

Traceback (most recent call last):

File "", line 1, in

AttributeError: myClass instance has no attribute '__superprivate'

print(mc._semiprivate)

world

print(mc.__dict__)

{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}

__foo__是一种约定,python内部的名字,用来区别其他用户自定义的命名,防止冲突。

_fo是一种约定,用来指定变量私有。

__foo是解析器用_classname__foo来代替这个名字,以区别和其他类相同的命名。

8.字符串格式化%s和format

format在许多方面更便利,对于%s更烦人的是它无法同时传递一个变量和元组。

"hi %s" % name

如果name是(1,2,3),它将会抛出TypeError异常,为了保证它总是正确的,你必须这么做

"hi %s"%(name,)#提供一个单元素的数组而不是一个参数

9.迭代器和生成器

在Python中,一边循环中一边计算的机制,称为生成器generator

可以被next函数调用并不断返回下一个值的对象称为迭代器iterator

10.*args和**args

当不确定函数将要传递多少个参数的时候可以用*args。

def print_1(*args):

for count,thing in enumerate(*args):

print("{0}{1}".format(count,thing))

**args允许你使用没有事先定义的参数名

def print_1(**kwargs):

for name,value in kwargs.items():

print("{0}{1}".format(name,value))

11.面向切面编程AOP和装饰器

装饰器是一种设计模式

经常用于切面需求的应用场景

较为经典的有

插入日志

性能测试

事务处理

装饰器是解决这类问题的绝佳设计。

有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。

装饰器的作用就是为已经存在的对象添加额外的功能。

12 鸭子类型

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。

比如在python中,有很多file-like的东西,比如StringIO,GzipFile,socket。它们有很多相同的方法,我们把它们当作文件使用。

又比如list.extend()方法中,我们并不关心它的参数是不是list,只要它是可迭代的,所以它的参数可以是list/tuple/dict/字符串/生成器等.

鸭子类型在动态语言中经常使用,非常灵活,使得python不想java那样专门去弄一大堆的设计模式。

13.重载

函数重载主要是为了解决两个问题

可变参数类型

可变参数个数

一个基本的设计原则是:仅仅当两个函数除了参数类型和参数个数不同以外。其功能完全相同的,此时才使用函数常在。

如果两个函数的功能不同,不应当使用重载,而应该使用一个名字不同的函数。

问题

函数功能相同,但参数类型不同,python如何处理?

根本不需要处理,因为python可以接受任何类型的参数,如果函数的功能相同,name不同的参数类型在python中很可能是相同的代码,没有必要做成两个不同的函数。

函数功能相同,但参数个数不同,python如何处理?

缺省参数,对那些缺少的参数设定为缺省参数即可解决问题。

14.新式类和旧式类

python3里的类全部都是新式类,这里有一个MRO问题,新式类是广度优先,旧式类是深度优先。

15.__new__和__init__的区别

__new__是一个静态方法,而__init__是一个实例方法。

__new__方法会返回一个创建的示例,而__init__什么都不返回

只有在__new__返回一个cls的实例时后面的__init__才能被调用。

当创建一个新实例时调用__new__,初始化一个实例时用__init__

__metaclass__是创建类时起作用,所以我们可以分别使用。

__metaclass__、__new__、__init__来分别在类创建,实例创建和实例初始化的时候做些手脚。

16.单例模式

class A(object):

def __new__(cls,*args,**kwargs):

if not hasattr(cls,'_instance'):

orig = super(A,cls)

cls._instance = orig.__new__(cls,*args,**kwargs)

return cls.__instance

class MyClass(A):

a = 1

共享属性

创建实例时把所有实例的__dict__指向同一个字典,这样他们具有相同的属性和方法。

class Borg(object):

_state = {}

def __new__(cls, *args, **kw):

ob = super(Borg, cls).__new__(cls, *args, **kw)

ob.__dict__ = cls._state

return ob

class MyClass2(Borg):

a = 1

装饰器版本

def singleton(cls, *args, **kw):

instances = {}

def getinstance():

if cls not in instances:

instances[cls] = cls(*args, **kw)

return instances[cls]

return getinstance

@singleton

class MyClass:

pass

python面试总结 博客园_python面试题总结相关推荐

  1. python实现杨辉三角形博客园_Python实现杨辉三角

    杨辉三角,是二项式系数在三角形中的一种几何排列.在欧洲,这个表叫做帕斯卡三角形.帕斯卡(1623----1662)是在1654年发现这一规律的,比杨辉要迟393年,比贾宪迟600年.杨辉三角是中国古代 ...

  2. python 面试题 博客园_python面试题

    1.一行代码实现1-100的和 print(sum(range(1,101))) #range中的参数是1<=i<101 #sum是计算参数的和 2.在函数内部改变全局变量 a = 5 d ...

  3. python tkinter教程 博客园_python tkinter教程-事件绑定

    一个Tkinter主要跑在mainloop进程里.Events可能来自多个地方,比如按键,鼠标,或是系统事件. Tkinter提供了丰富的方法来处理这些事件.对于每一个控件Widget,你都可以为其绑 ...

  4. python读二进制文件博客园_python二进制读写文件

    基础: open(path, mode, b_buffer_size),需要指出的是第三个参数,它用来控制IO的时候是否使用缓存,这个缓存指的是python自己开辟的一片内存吧. seek(offse ...

  5. python的selenium模块博客园_Python学习--Selenium模块学习(2)

    Selenium的基本操作 获取浏览器驱动寻找方式 1. 通过手动指定浏览器驱动路径 2. 通过 `$PATH`环境变量找寻浏览器驱动 控制浏览器访问URL find系列函数定位元素 - `find_ ...

  6. python博客园_python模拟博客园登录-基础版

    mport time import inspect from functools import wraps user_status = {'username': None,'status': Fals ...

  7. 用python自动登录博客园

    from selenium import webdriver import timea=webdriver.Chrome()a.get("http:\\www.baidu.com" ...

  8. python 爬虫 博客园_Python爬虫爬取博客园作业

    分析一下他们的代码,我在浏览器中对应位置右键,然后点击检查元素,可以找到对应部分的代码.但是,直接查看当前网页的源码发现,里面并没有对应的代码.我猜测这里是根据服务器上的数据动态生成的这部分代码,所以 ...

  9. python搭建个人博客推荐_Python+Django搭建个人博客(4)-Django模板

    模板演示 建立blog下templates文件夹 添加博客首页HTML 在templates文件夹中新建一个blog_index.html 在blog_index.html写简单的欢迎内容 我的博客- ...

最新文章

  1. 强人总结的哄老婆秘籍
  2. python编程能力等级测试_56岁的潘石屹参加全国青少年编程能力等级测试,你还在问编程是什么?...
  3. 数据结构与算法-day3-归并 快速排序
  4. 《qss样式表笔记大全(二):可设置样式的窗口部件列表(上)(包含相关示例)》
  5. TIP 2021论文:多曝光图像融合及超分辨的联合实现
  6. sklearn模型支持输入list吗?
  7. 作为一个程序员需要学多少技能?
  8. 使用Nodejs将js文件转换成json文件
  9. android svn新建分支,android studio中创建、切换svn分支
  10. 数据结构实验一,第10题:基于顺序存储结构的图书信息表的图书去重
  11. Google浏览器常用设置
  12. Linux下视频流媒体服务器搭建详解理论
  13. 【转】如何在Ubuntu 16.04上使用UFW设置防火墙
  14. 多层神经网络 ——小批量梯度下降法
  15. h3cr4900g3安装系统_H3C服务器安装Windows操作系统
  16. centos 配置java环境
  17. 华为emui10安装谷歌三件套_谷歌三件套小米专版2020下载-谷歌三件套一键安装小米手机下载3.0.3...
  18. Airflow使用MsSqlHook与数据库交互
  19. CodeForces 891 E.Lust(生成函数)
  20. 小米盒子3增强版 android tv,小米盒子3增强版刷Android TV系统

热门文章

  1. Jsonplugin+struts2使用说明
  2. Mac OS 下安装 MacVim
  3. 使mysql查询条件区分大小写 数据库搜索中大小写敏感性
  4. 《python数据分析实战》第七章手写
  5. Struts2之ModelDriven
  6. [Python]小甲鱼Python视频第32课(except)课后题及参考解答
  7. jenkins配置从节点
  8. 007.Adding a view to an ASP.NET Core MVC app -- 【在asp.net core mvc中添加视图】
  9. PHP整数取余返回负数解决办法
  10. Android自动化测试之路——Provider(一)