用python分析nginx访问日志文件:每个ip访问的次数
ips = {}
lins = open(‘/var/log/nginx/access.log’).readlines();
for line in lines:
ip = line.split(“str”)[0]
if 7 <= len(ip) <= 15
ips[ip] = ips.get(ip,0) + 1
print(ips)
4种函数:
全局函数:定义在模块中
局部函数:嵌套与其他函数中
lambda函数:表达式
方法:类中定义的函数,与特定数据类型关联的函数,并且只能与数据类型关联一起使用
函数:
def functionName(parameter):
suite
def返回一个函数对象,被functionName引用,与bashell函数不同
变量名引用分三个作用域进行:首先是本地(local),之后是函数内(function locals),接着是全局(global),最后是内置(built-in)
法则:作用域越小,优先级越高
内嵌函数:
如果外层函数直接把内层函数使用return返回,则调用外层函数时赋值的变量名引用的是一个内层函数对象,且此内层函数能够记忆其内部引用的外层函数的变量,这种行为叫做工厂函数、也叫闭合函数。
>>>def maker(N):
def action(X):
return X ** N
return action
>>>f = maker(2)
>>>f(3)
>>>9
有两种方式避免可变参数被函数修改
- 直接传递可变对象的副本:testFunc( A,B[:] )
- 在函数内部创建可变参数的副本:B=B[ : ]
参数匹配模型:
- 位置:从左而右
- 关键字参数:”name = value” ,明确指明哪一个参数传递哪一个值
- 默认值:定义函数时直接给变量一个默认值 “name = value”
语法:
函数:
def func(name) :
def fucn(name=value) 默认参数值
def func(*name) 匹配并收集(在元组中)所有包含位置的参数
def func(**name) 匹配并收集(在字典中)所有包含位置的参数
def func(*args,name) 参数必须在调用中按关键字传递
调用者:
func(value)
func(name=value)
func(*sequence) : 元组解包对位传送
func(**dic) : 字典解包对位传送
可以混合使用 func( a, *a )
lambda运算符:
lambda args:expression
首要用途:返回一个函数对象,
>>> def testFunc(x,y,z) : return x + y + z
>>>testFunc(4,5,6)
15
>>> f = lambda x,y,z : x + y + z
>>> f(4,5,6)
15
生成器:返回一个生成器对象,它可用于迭代生成结果,而非一次返回所有结果,对内存非常友好,不占太多内存
obj1 = ( expression for iter_var in iterable )
obj2 = ( expression for iter_var in iterable if condition )
调用: obj1__next__()
生成器只适用一次,不支持列表类型的操作,如append,pop,但可以转换为列表 l1 = list(obj1)
函数正常要用renturn语句,执行返回; 也可以使用yield,但此时对函数的调用,返回的是一个生成器对象,而非函数执行结果;
yield :
def genNum(n):
x = 0
while x <= n:
x+=1
yield x
>>>g1 = genNum(10) : genNum函数返回生成器对象
>>>g1.__next__()
面向过程:自己去做
面向对象:叫别人去做