-
导入模块math后为何引用sqrt时还要加math: math是包含各种函数或方法的模块,若前面是import math, 引用模块中的函数就要用格式math.sqrt()。 若想省略前面的模块名,在前面导入时用from math import *查看全部
-
介绍看懂了,但是题目没有看懂,以后回看查看全部
-
先来弄懂例子 def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() 。f1, f2, f3 = count() 这个代码是什么意思,最开始理解为:把count()赋值给f1,f2,f3,即等同于 f1 = count() f2 = count() f3 = count() 而这种理解是错误的。因为count最后返回的是fs,fs是一个list,其中有三个元素,而这个代码的意思是把这三个元素分别赋值给f1,f2,f3.所以最后f1f2f3返回的是数字,而不是list。 为什么最后f1f2f3返回的数字是一样的,因为在函数里,最后添加到fs的是什么,是一个f函数,而不是最终的值,如果是添加最终值,应该是fs.append(f())并且这三个f函数中都引用了同一个变量i,而变量i是可变的,在最后调用这个函数的时候才把值展示,这样的话就会导致,在最后调用这个f函数的时候i是等于3的,所以就出现了f1f2f3三个值相等的情况。查看全部
-
感觉我的比他的简单耶查看全部
-
*args可以当作可容纳多个变量组成的tuple **kw可以当作容纳多个key和value的dict 同时使用*args和**kws时,必须*args参数列要在**kw前查看全部
-
记得调用数学函数时应该加入:import math
然后平方根的三种表达方法别忘记。。。
第一种调用math函数库 math.sqrt
第二种调用内置函数库 pow(x,0.5)
第三种直接利用** x**0.5
查看全部 -
map()函数不改变原有的 list,而是返回一个新的 list。
s.capitalize()第一个大写,其他全部小写
print(str.upper()) # 把所有字符中的小写字母转换成大写字母 print(str.lower()) # 把所有字符中的大写字母转换成小写字母 print(str.capitalize()) # 把第一个字母转化为大写字母,其余小写 print(str.title()) # 把每个单词的第一个字母转化为大写,其余小写
查看全部 -
import time #调用函数参数
def performance(f): #定义装饰器函数
def fn(*args,**kw): #定义接收任何参数的子函数
t1=time.time() #获取当前电脑时间
r=f(*args,**kw) #传入并运行factorial()函数
t2=time.time() #获取当前电脑时间
print 'call %s() in %fs' % (f.__name__,(t2-t1))
#%s表示该位置应填入字符串,%f表示该位置应填入浮点型数字(即包含小数尾数的数字),()和s没任何意义(还是()和s),(f.__name__,(t2-t1))以元组形式表示需要填入的字符串(本处f.__name__=factorial)和浮点型数字
return r #返回执行factorial()函数后的值
return fn #返回子函数fn
@performance #定义装饰器
def factorial(n): #定义原函数factorial()
return reduce(lambda x,y: x*y, range(1, n+1)) #以匿名函数定义原函数运算规则和返回值
print factorial(10) #此时的factorial经过装饰器@performance包装,已经是performance(factorial),该命令等价于 print performance(factorial)(10)
#输出fn()运算结果:1、给出装饰器添加的部分:call factorial() in 0.0000s;2、给出原函数factorial(10)元算结果,3628800
查看全部 -
带参数的decorator需要三层嵌套,是因为: 最里一层,必然是一个参数列表为(*args,**kw)的wrapper,执行自身逻辑与运行目标函数,返回的是目标函数的执行结果; 倒数第二层,必然是一个参数列表为(f)的函数,用来接受目标函数,以供wrapper调用(闭包),并返回wrapper; 如果是无参数decorator,这时已经够了,python解释器会自动把@decorator转换成 f=decorator(f); 但如果是有参数decorator,还需要最后一层,因为还有一个decorator自身的参数要传递以供内部闭包使用。因此,最外一层就是decorator,参数列表为decorator自身需要的参数列表,返回的其实还是内部的wrapper。(因为外两层只为传递参数,并没有自身逻辑实现)
查看全部 -
%是格式化的意思,%s是格式化字符串,%f是格式化浮点数,%c是格式化字符 >>>print 'call %s() in %fs' % (f.__name__, (t2 - t1)) 这句话的意思是把f.__name__插入到了%s这个位置,(t2-t1)计算后的值插入到了%f这个位置查看全部
-
calc_prod返回了一个不带参数的函数lazy_prod(), lazy_prod()这个函数返回了一个经过reduce()计算后的结果,就是最终计算出来的值。 f = calc_prod([1, 2, 3, 4])的执行结果是函数lazy_prod的引用,也就是所f就是calc_prod的返回值,是一个函数。 最后f()才真正调用了上一步返回的函数,执行了reduce并返回最后的结果。 这里其实用到的就是闭包,函数内部的函数可以访问外部函数的局部变量,包括参数。 并且返回一个新的函数。查看全部
-
f1, f2, f3 = count()中为何要有3个元素f1, f2, f3?因为count()返回的是fs,而fs是什么?是列表。什么列表?有3个元素的列表。为什么有3个元素?因为for语句的rang(1,4)。所以相当于 f1,f2,f3=[ 值,值 ,值 ]。所以f1, f2, f3中你不能多写一个f4或少写f1, f2, f3其中任何一个,因为你要分别匹配[ 值,值 ,值 ]3个。好,现在我问你列表里的值是什么?是[1,4,9]?哈哈,错了,不是,你可以看到r输出的是<function count.<locals>.f.<locals>.g at 0x10067bae8> 之类的(有3个)。我们来分析r = f(i)。首先第一个循环,i=1,那就是f(1),请问f(1)返回的给r的是什么?看到return g没有?是g,也就是g()函数的地址,f1-->r-->g,f1指向的是g的地址。剩下的i=2、i=3一样。所以r就是g()函数的地址。fs.append(r)就是将r追加到列表fs[]中,所以输出r你看到的是以下输出: [<function count.<locals>.f.<locals>.g at 0x10067bae8>, <function count.<locals>.f.<locals>.g at 0x10067ba60>, <function count.<locals>.f.<locals>.g at 0x10067bb70>] 看到了吗?[地址,地址,地址]。ps:g的地址为什么不同?因为你创建循环3次调用了f(),自然调用了3次g() 终于最后一步了:print(f1(),f2(),f3()),你会问为什么f1还要加上()。f1指向的是g的地址,所以f1()表示什么?表示是g()。i=1,传参数给j。所以g()就返回1*1(return j * j)。同理f2()=2*2,f3()=3*3.查看全部
-
正确的写法: class C(A, B) def __init__(self, a, b): A.__init__(self, a) B.__init__(self, b) 建议养成习惯,不要使用super()这个函数,即便是单继承,也使用上面的方式查看全部
-
大小写转换 1.capitalize()方法是实现首字母大写,其余字母小写的方法 2.upper()方法是将字母小写转大写 3.lower()方法是将字母大写转小写 map()函数不是改变原有的list,而是返回一个新的list。它是一个内置高阶函数查看全部
-
print p1._Person__count 可以在class外部访问类的私有属性查看全部
举报