访问几次
现在有几个访问记录
读模式打开文件,readlines把内容读出来放在fh,文件小可以,文件大了就危险了
可以使用迭代的方式遍历这个文件,字符串有个方法 split切分,指明切割字符是什么
切割使用空格当切分符,切分的结果生成一个新列表,再去第0个结果就是ip地址
在原来的也一样,需要遍历,一个ip字节数最少大于7 1.1.1.1 最大不超过15个字节
ip地址当键,获得值以后+1
dict字典有个方法叫get,可以有两个参数,如果D字典有键是K 就确定D【k】的值,否则就用d
把这个写到文件里
readlines把所有行读出来放到logs
函数:都是实现代码重用,和结构化编程
4种函数
lambda 是匿名函数,放在任何一个表达式
类似open,len,type
定义函数,def 函数名(形参)
suite 结束
运行函数的只会def语句,把函数对象创建出来,只有调用的时候才会运行
函数在运行时只会创建对象,调用的时候才会运行
在python调用函数在任何时候都需要后面+小括号()
函数有作用域的概念,函数名也只是一个名称,
python有名称空间的概念,每一个的名称的查找都是在名称空间进行的,函数定义的位置,决定 了所处的名称空间的不同,本地变量和局部变量,局部变量只能在函数中使用
整个变量在哪个范围可用,就是名称空间的概念
python的每一个函数都定义了本地的作用域,而模块定义的是全局作用域
pyhton的每一个文件都是模块,在模块内有#!,doc,import,函数定义,类定义,任何单个文件,这个模块就会定义一个全局作用域,
类似import cpoy,cpoy会引入一个新的名称空间
比如import platform,platform也有很多名称可用,在当前的模块变量里,都是直接引用的
假如定义了a=3,import m1,m1里面也有a。只能使用m1.a来引用,这样就需要m1有名称空间,当前模块也要有自己的名称空间,叫全局名称空间,其他模块需要加模块名来引用
当前的文件,称为全局名称空间,同时如果在里面定义函数,函数会引入一个新的名称空间,类似bash中的局部作用域,函数中还可以嵌套函数,var1=4嵌套var1=6,到底是多少,看在哪里引用,
全局作用域仅限于单个文件,不会跨文件的,如果跨文件,必须模块名.来引用
因为函数定义的时候函数不会运行,只有调用才会运行,调用运行时开始会形成新的作用域,直到调用结束
变量名有解析
查找优先级是,local,enclosing function locals外层函数,global全局,built-in
作用范围越小,优先级越高
ips就是全局的,只要没在函数中定义,就是全局的
可用使用全局变量保存函数的状态信息
只需要知道在pthon中函数可以嵌套,做返回值的时候,可以把整个函数返回
maker函数内部嵌套action函数,return 把action返回
f=maker(2),return的时候这个函数运行
f引用action函数
f(3)向action(x)传递3
f3=3 的2次方
f4 4 的2次方
这种叫闭合函数,当函数可以把传递的值记录下来,多次调用
定义函数,
定义字符串变量
内部再定义函数,在f1中调用f2.然后再调用f1
f2再定义 test,print应该是内层的
再定义函数,传递参数n,打印n 让n=456再print,等函数结束,再次调用
调用l1,把l1传递给mylist,mylist相当于l1的结果
为什么两次不一样,是因为。a是123数值,是不可变对象,意味a始终指向123
a变量指向123,调用函数的时候,把a传递给n,n也指向123,n赋值456,就需要创建新的对象,然后n指向456,所以print的n时候是456,a指向是123
对于可变对象就不一样了,l1指向[123,456],l1传递给mylist,,mylist指向统一对象,修改mylist,这个对象支持修改,就把123,改成hello了,不会创建新对象
所以不建议把可变对象传递给函数
不得不传递可以这么做,有两种方式
表示传递B的副本而不是B的本身
3+10=13,x是列表,显示L也是13,原来改变了
这种方式就不会被改变
精确传递才能正常调用,对位传递,位置参数
上面的是位置参数,也可以指定形参传递给哪个值
传递的时候可以留空传递,有默认值的时候,带默认值的参数要放在后面,不带默认值放在前面a
可变参数,做位置参数
当字典来用,做关键字参数
定义有默认值的形参
解包,嵌套,传递到底怎么运行
*如果使用两个星号 **
也可以定义的时候,具体的参数,传递的时候,传递的是带星号的值
有的是调用带星号,有的是参数带星号
也可以定义不使用星号,调用的时候加上星号,把你一单独参数解包进行传递
**代表把这个字典转换成a=123,b=456,这叫关键字参数
**两个元素传递给,f5 *解包以后参数还是不够,可以先传递参数,189,可以混合使用
一种是定义时用于收集参数的
一种是定义的时候,参数是固定的,传递时+号,组合数据类型以达到基于位置参数,或关键字参数解包传递的目的
函数可以接受其他函数当参数,就叫做高阶函数,函数 式编程就是基于高阶函数实现
lambda是定义匿名函数的,既然没有明就不是语句,而是一个表达式,所以可以出现在任何表达式放的位置,、定义形参xyz,返回加起来的和
也可以使用lambda表示,xyz,lambda表达式返回的是一个函数对象,可以保存在名称上,来引用lambda函数
lambda函数调用起来有更好的玩法,定义两个参数,返回,后面(传递参数)
生成器:就是一个表达式对象,它执行的计算机制与列表解析相同;但是列表解析会直接创建整个列表对象,而生成器则只返回一个生成器对象,它可用于迭代地生成结果,而非一次返回所有结果;
使用方法
(expression for Iter_var in Iterable)
(expression for Iter_var in Iterable If condition)
生成一个偶数列表,2到10000,一次步进2
print提示你这是内存中的某个对象
整个数据都在内存中放着
列表可以重复使用,在内存里,生成器一次只生成一个
所以生成器表达式不会创建序列类型的对象
生成器只能按迭代方式生成值
所以所有的生成器对象不能进行索引,也不能执行任何常规的列表操作,列表可以append,追加值,pop弹出
生成器不能这么做
但是可以将生成器转换成列表
现在就成列表了,18开始,因为16之前已经用过,只要曾经被调用,就不再有
还可以自定义生成器
函数正常要使用return语句,执行返回:也可以使用yield:但此时对函数的调用,而非函数执行结果;
如果一个函数使用了yield,函数调用的时候,不会直接执行,而是返回一个生成器对象
yield语句:
**如果x从0开始,只要x<=n,就返回x的值,先看return返回的值,重新定义
return就是函数结束了,print会一直循环下去 **
正常方式的返回结果
最后终止
每一次函数调用从头开始,不会记录上一次的结果,跟上一次没有任何关系
yield只是暂时的调换
devisor除数,求x的平方根+1,并且取整
如何判断质数,除以平方根,从2到它的平方根内的所有数字
判断9是不是质数,从2到9的平凡跟之前,有没有哪个数字能被9整除,
10的平方跟是3.几,3.几+1=4. ,所以2-4,的数除以10,10/2=5.所以10不是质数
11,不能被2-4整除,就是质数
返回指定数字范围内的,所有素数列表
指定100,就范围100以内的所有质数/(素数)列表
导入math库
math(函数库).sqrt是求平方根
===0代表非素数,return false
否则返回真
最后整个函数return ture
定义primes函数
范围包含y+1
is——prime判断j是否素数
yeild j
然后开始调用primes生成器
可以一次次调用,
直接遍历生成器是不可以的
可以用list强行转换成列表对象
但是定义列表就不需要遍历生成器,生成器只是一次需要的时候,而不是i一下子遍历所有元素