1 #!/usr/bin/env python
2 #coding:utf-8
3
4 'a test module'
5
6 __author__ = 'Sunflower'
7
8
9 ## 一、基础函数
10 help(abs) #str是某种参数类型 R里面查看参数类型
11 cmp(1,2) #如果想x
12 #可以吧函数名赋予给变量
13 a =abs14 a(-1)15 #自定义 def 函数名(参数):
16 defmy_abs(x):17 if x>=0:18 return x #执行到return 函数结束
19 else:20 return -x21
22 #空函数
23 defnop():24 pass #可让代码跑起来
25
26 #参数检查
27 #1.个数不对 报错typeerror
28 #2.类型不对 (需要提前检查)
29 defmy_abs(x):30 if not isinstance(x, (int,float)): #检查是否为数字类
31 raise TypeError('bad operand type')32 if x>=0:33 returnx34 else:35 return -x36
37
38 import math
39 def move(x, y, step, angle=0):40 nx = x + step *math.cos(angle)41 ny = y - step *math.sin(angle)42 returnnx, ny43
44 r = move(100, 100, 60, math.pi / 6)45 print r #返回元组 tuple
46
47
50 ## 参数
51 #1. 默认参数 放后面 变化越小越放后面;按次序,
52 #2. 可变参数 加* 。 # 列表或者元组时也可以
53 def calc(*numbers):54 sum =055 for n innumbers:56 sum = sum + n *n57 returnsum58 #a = calc([1, 2, 3]) # 1.没有*时,函数需要先组成一个List或者tuple
59 a = calc(1,2,3) #2.加* 可变
60 nums = [1,2,3]61 a1 = calc(*nums) #3.在list前面加一个*解决list变可变
62 printa1
64 #3. 关键字参数
65 def person(name, age, **kw):66 print 'name:', name, 'age:', age, 'kw:', kw67 person('Ann', 30)68 person('Bob', 30, city='beijing') ##?? 中文时出错
69 kw = {'city':'beijing', 'job':'engineer'}70 person('Jack', 28, **kw) #多输入
71
72 def person(name, age, **kw):73 print 'name:', name, 'age:', age, 'kw:', kw74
75
76 names=['Bob','Amy']77 age=[23,30]78 city=['nanjing', 'beijing']79 job=['Math','Teacher']80 kw = {'city':city, 'job':job}81 print(kw)82 print(kw["city"])83 print(kw['city'][0],kw['job'][0]) #需要某一行数据??
84 for i in range(len(names)): #从0开始,小于len=2. range(0,2)=0,1 R 里面将1:20
85 person(names[i], age[i], kw={'city':city[i], 'job':job[i]}) ## 加入job???????
86 #或者
87 for name innames:88 i = names.index(name) #元组位置挑取list.index R里面which=
89 person(names[i], age[i], kw={'city':city[i], 'job':job[i]}) ## 加入job???????
90
91 #综合例子
92 def func(a, b, c=0, *args, **kw):93 print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw #加括号和不加不一样??
94 func(1, 2, 3)95 func(1, 2, 3, 'a', 'b')96 func(1, 2, 3, 'a', 'b', high=99)97
98 args = [1,2,3,'a', 'b']99 kw = {'high':99}100 func(*args, **kw)101
102
103 #递归函数 函数内部调用自身
104 deffact(n):105 if n==1:106 return 1
107 return n * fact(n-1)108 f = fact(1)109 print(f)110
111 #为了防止栈溢出,改成尾递归方式
112 deffact(n):113 return fact_inter(n, 1)114 deffact_inter(num, product):115 if num == 1:116 returnproduct117 return fact_inter(num -1, num *product)118
119 print(fact(5))120
121
122
123 ## 高阶函数
124 #map 相当于映射(函数,序列) 返回list
125 deff(x):126 return x *x127 #计算平方
128 L =[]129 for n in [1, 2, 3, 4, 5, 6, 7]:130 L.append(f(n))131 printL132 print(map(f, [1,2,3,4,5,6,7])) #改为map形式 # 1.map()
133 print(map(str,[1,2,3,4,5])) #输出字符串形式
134
135 #reduce 把计算结果和序列下一个元素计算
136 deffn(x, y):137 return x * 10 +y138 print(reduce(fn,[1, 3, 5, 7])) #2.reduce()
139
140 #名字首字母大写
141 #方法一
142 defchange(name):143 return name.capitalize() #capitalize()
144 names = ['adam', 'LISE', 'barT']145 change_name =map(change, names)146 print(change_name)147 #方法二
148 defchange(name):149 return name[:1].upper() + name[1:].lower() #.upper() .lower()
150 names = ['adam', 'LISE', 'barT']151 change_name =map(change, names)152 print(change_name)153
154 #累计求积
155 defprod(t):156 ifisinstance(t,list):157 return reduce(lambda x,y: x*y, t) #3.lambda()
158 else:159 pass
160 t = [1,2,3,10]161 printprod(t)162
163 print reduce(lambda x,y:x*y, [1,2,3,10])164
165
166 #filter 过滤序列
167 def is_odd(n): #删除偶数
168 return n % 2 ==1
169 filter(is_odd, [1,2,3,4,6,8,9]) #4.filter
170
171 #素数
172 defis_prime(n):173 if n < 2:174 returnFalse175 for i in range(2, n):176 if n % i ==0:177 returnFalse178 returnTrue179 print filter(is_prime, range(1,101))180
181 #删除空格
182 defnot_empty(s):183 return s ands.strip()184 f = filter(not_empty, ['a', ' ', '', None, 'C'] ##???????????
185 print(f)186
187 #sorted
188 L = [36, 5, 1, 23]189 print(sorted(L)) #顺序 # 5.sorted
190 #倒序
191 defreversed_cmp(x, y):192 if x >y:193 return -1
194 if x <195 return>
196 return0197 print(sorted(L, reversed_cmp)) #倒序
198 #大小写
199 L1 = ['Bob', 'Zoo', 'ann']200 print(sorted(L1)) #排序,且大写在前
201 defcmp_ignore_case(s1,s2):202 u1 =s1.upper()203 u2 =s2.upper()204 if u1 <205 return>
206 if u1 >u2:207 return 1
208 return0209 print(sorted(L1, cmp_ignore_case)) #忽视大小写
210
211 #返回函数
212 def calc_sum(*args):213 ax =0214 for n inargs:215 ax = ax +n216 returnax217
218 def lazy_sum(*args):219 defsum():220 ax =0221 for n inargs:222 ax = ax +n223 returnax224 returnsum225 f = lazy_sum(1, 3, 5, 7)226 print(f) #函数
227 f()228 print(f()) #结果
229
230 #闭包
231 defcount():232 fs =[]233 for i in range(1, 4):234 deff():235 return i*i236 fs.append(f)237 returnfs238 f1, f2, f3 =count()239 print(f1())240 print(f2())241 print(f3())242 ## 上面结果全为9, 返回函数不要引用任何循环变量,
243 #修改 需要创建一个函数,用该函数的参数绑定循环变量当前值,无论后续如何修改,已绑定的值不变
244 defcount():245 fs =[]246 for i in range(1, 4):247 deff(j):248 defg():249 return j*j250 returng251 fs.append(f(i))252 returnfs253 f1, f2, f3 =count()254 print(f1())255 print(f2())256 print(f3())257
258 #匿名函数 不需要显式的定义函数,直接传入匿名函数更方便
259 map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]260
261
262 #装饰器 #???
263 defnow():264 print '2016-12-25'
265
266 f =now267 print(f())268
269 print(now.__name__) #拿到函数名字
270
271
272 deflog(func):273 def wrapper(*args, **kw):274 print 'call %s():' % func.__name__
275 return func(*args, **kw)276 returnwrapper277 @log278
279 #偏函数
280 def int2(x, base=2):281 returnint(x, base)282 print(int2('1000000'))283 #创建偏函数的写法 functools.partial作用:把默写参数给固定住(设置默认值)
284 importfunctools285 int2 = functools.partial(int, base=2)286 print(int2('1000000'))
205>195>