Python 强化训练:第七篇

强化训练:第七篇


主题:

  1. 函数参数、默认参数、关键字参数
  2. **args, **kwargs
  3. super()
  4. 字典初始化
  5. 闭包
  6. 函数作用域
  7. 装饰器:返回函数的高阶函数
  8. 类属性和实例属性
  9. __slots__限制实例属性

星号用于函数传递参数

* 表示元组:代表任意多个参数

def onefunc(a, *b):
    return a, b

print(onefunc(1, 2, 3, 4, 5))

#(1, (2, 3, 4, 5))

** 表示字典:代表任意多个关键字参数

def twofunc(a, **b):
    return a, b

print(twofunc(1, x=1, y=2, z=3))
#(1, {'z': 3, 'x': 1, 'y': 2})

* 用于表示关键字参数

def threefunc(a, *b, c):   # c表示关键字参数
    return a, b, c

print(threefunc(1, 2, 3, 4, c=88))   # 参数c不可省略
#(1, (2, 3, 4), 88)

def fourfunc(a, *, b):
    return a, b

print(fourfunc(1, b=90))   # 参数b不可省略
# (1, 90)

接受任意多参数, 任意多关键字参数

def fivefunc(*args, **kwargs):
    return args, kwargs

print(fivefunc(1, 2))
print(fivefunc(1, a=1, c=9, d=10))
print(fivefunc(1, 2, 3, w=12, f=34))
#((1, 2), {})
#((1,), {'c': 9, 'a': 1, 'd': 10})
#((1, 2, 3), {'f': 34, 'w': 12})

super()

在super机制里可以保证公共父类仅被执行一次,至于执行的顺序,是按照MRO(Method Resolution Order):方法解析顺序 进行的。
class A(object):
    def __init__(self):
        print("A start")


class B(A):
    def __init__(self):
        A.__init__(self)
        print("B start")


class C(A):
    def __init__(self):
        A.__init__(self)
        print("C start")


class D(A):
    def __init__(self):
        A.__init__(self)
        print("D start")


class E(B, C, D):
    def __init__(self):
        B.__init__(self)
        C.__init__(self)
        D.__init__(self)

classname_e = E()
print("----------------------------------")

class A_1(object):
    def __init__(self):
        print("A start")


class B_1(A_1):
    def __init__(self):
        super().__init__()
        print("B start")


class C_1(A_1):
    def __init__(self):
        super().__init__()
        print("C start")


class D_1(A_1):
    def __init__(self):
        super().__init__()
        print("D start")


class E_1(B_1, C_1, D_1):
    def __init__(self):
        super(E_1, self).__init__()



classname_e_1 = E_1()

#A start
#B start
#A start
#C start
#A start
#D start
#----------------------------------
#A start
#D start
#C start
#B start

字典初始化

dict_one = {}   # dict_one = dict()
dict_one["a"] = 1
dict_one["b"] = 2
print(dict_one)
#{'b': 2, 'a': 1}

dict_two = dict((['a', 1], ['b', 2]))
print(dict_two)
#{'b': 2, 'a': 1}

keys_range = [i for i in "xyz"]
values_range = 1
dict_four = {}.fromkeys((keys_range), values_range)
print(dict_four)
#{'z': 1, 'x': 1, 'y': 1}

闭包:

1. 有一个内嵌函数

2. 内嵌函数使用外部函数的变量

3. 外部函数的返回值是内嵌函数

函数的调用 funcname()

函数是对象可以当成参数进行传递

def sample():

    n = 0

    def func():    # 内嵌函数
        print("n=", n)

    def get_n():     # 内嵌函数
        return n

    def set_n(value):    # 内嵌函数
        nonlocal n
        n = value

    func.get_n = get_n
    func.set_n = set_n
    return func    # 返回内嵌函数

funcname = sample()
funcname()
#n= 0

参数作用域

# 1. 局部
# 2. 内嵌参数
# 3. 全局
# 4. 内建
# 5. 搜索顺序: 局部> 内嵌 >全局> 内建


number = 10    # 全局变量


def parameter():

    number =0    # 局部变量

    def max(a):
        number = 3    # 内嵌
        if number > a:
            return number
        else:
            return a
    return max

pa = parameter()
print(pa(5))
print(number)
#5
#10

装饰器:函数作为参数,返回一个函数

def dec(func):
    def wrap(a):
        print("func_name: ", func.__name__)
        a += 10
        return a
    return wrap


def dec_w():
    pass


from datetime import datetime


def print_now(fn):
    def fn_wrap(*args, **kwargs):
        print("now time: %s, the fn name: %s" % (datetime.now(), fn.__name__))
        return fn(*args, **kwargs)
    return fn_wrap


@print_now
def hello(name="xiewei"):
    print("Hello World! %s" % name)
    
de = dec(dec_w)
print(de(200))
hello()
#func_name:  dec_w
#210
#now time: 2016-11-06 20:29:02.491987, the #fn name: hello
#Hello World! xiewei

类属性和实例属性

class Apple(object):
    name = "Apple"

    def __init__(self, number):
        self.number = number


A = Apple(500)
print(A.name)
print(A.number)
A.size = 12
print(A.size)
A.name = "chuizi"
print(A.name)
del A.name
print(A.name)
print(Apple.name)
#Apple
#500
#12
#chuizi
#Apple
#Apple

限制实例属性 __slots__

class chuizi(object):
    __slots__ = ["phone", "price", "brand"]
    def __init__(self, phone, price, brand):
        self.phone = phone
        self.price = price
        self.brand = brand


B = chuizi("M1", 2499, "chuizi")
print(B.phone)
print(B.price)
print(B.brand)
B.size = 5.5
print(B.size)  # wrong
#M1
#2499
#chuizi
#5.5
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,443评论 0 6
  • 定义类并创建实例 在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类...
    绩重KF阅读 3,914评论 0 13
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,757评论 1 10
  • Python进阶框架 希望大家喜欢,点赞哦首先感谢廖雪峰老师对于该课程的讲解 一、函数式编程 1.1 函数式编程简...
    Gaolex阅读 5,484评论 6 53
  • Hello Word 在屏幕上打印“Hello, world”,可以用一行代码实现: 你不需要为了输入输出或者字符...
    restkuan阅读 3,128评论 0 5