设为首页 收藏本站
查看: 1552|回复: 0

[经验分享] 我的python学习--第四天

[复制链接]
发表于 2018-8-12 10:49:20 | 显示全部楼层 |阅读模式
  一、首先是对前三天的学习内容进行复习
  1、python基础的数据结构
  数字(int/float,包括整数和浮点数)
  布尔(boolean => True/False)
  字符串(str,使用''或""括起来)
  列表(list)
  列表是使用[]括起来的一组数组,在内存中是连续的,可以对其增删改查
  字典(dict)
  字典是使用{}括起来的k/v键值对,经过哈希计算随机分布在内存中,是无序的,可以对其增删改查
  元组(tuple)
  元组与列表类似,不同之处在于元组的元素不能修改,元组使用小括号()
  2、python的语法
  定义变量 a=1
  if else语句
  if 布尔值:
  True执行这里
  else:
  False执行这里
  for循环
  循环list或者dict
  while循环
  while 布尔值:
  布尔值真,一直执行
  break/continue
  调试方法(print)
  help()函数和dir()函数
  help()函数是查看函数或模块用途的详细说明,而dir()函数是查看函数或模块内的操作方法,输出的是 方法列表。
  3、list和dict的区别
  list有顺序
  查找、追加很快,插入、删除很慢,命中cpu缓存的概率大
  dict没顺序
  查找、修改、删除都很快
  dict->list : for key,value in dict.items()
  list转成dict : for index,value in enumerate(list)
  4、文件读取
  open:打开文件
  read、readline、readlines:读取文件内容
  write、writelines:文件写入
  close:关闭文件
  tell()和seek()
  文件刚打开时,只能在开始的位置,每次read、readline、readlines时都会移动指针到读取数据的地方
  tell():返回文件所在指针的当前位置
  seek(#,whence=0):从文件中移动#个文件指针,正数则往结束方向移动,负数则向开始方向移动,如果设定了whence参数,就以whence设定的起始位置为准,0表示文件开始处、1表示当前位置、2表示文件结尾处
  二、对第三天的统计nginx访问日志,获取访问前十的ip地址,并用html的格式呈现的练习进行优化
#!/usr/bin/python  
#coding:utf-8
  

  
res = {}
  
'''
  
f = open('access.log')                             # 优化前的文件开启,关闭
  
...
  
f.close()
  
'''
  
with open('access.log') as f:                      # 优化后的文件开启,关闭
  
    for line in f:
  
        tmp = line.split(' ')
  
        ip,url = tmp[0],tmp[6]
  
        '''
  
        if (ip,url) in res:                        # 优化前的数据统计
  
            res[(ip,url)] += 1
  
        else:
  
            res[(ip,url)] = 1
  
        '''
  
        res[(ip,url)] = res.get((ip,url),0)+1      # 优化后的数据统计
  
res_list = res.items()
  
# print res_list
  

  
'''                                                # 优化前,使用冒泡法进行排序
  
for j in range(11):
  
    for i in range(len(res_list)-1):
  
        if res_list[1] > res_list[i+1][1]:
  
            res_list,res_list[i+1]=res_list[i+1],res_list
  
'''
  

  
res_list = sorted(res_list,key=lambda x:x[1],reverse=True) # 优化后使用sorted函数排序
  

  
i = 0
  
html_str = '<table border="1px">'
  
# res_list.reverse()
  
for r in res_list[:10]:
  
    i = i+1
  
# (('218.200.66.204', '/data/uploads/2014/0707/12/small_53ba21ee5cbde.jpg'), 1),
  
    html_str += '<tr><td>No%s</td> <td>%s</td><td>%s</td><td>%s</td>'%(i,r[0][0],r[0][1],r[1])
  
html_str+='</table>'
  

  
html_f = open('res.html','w')
  
html_f.write(html_str)
  
html_f.close()
  三、函数(第四天重点)
  函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
  函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
  定义函数的规则:
  函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
  任何传入参数和自变量必须放在圆括号中间。圆括号中间可以用于定义默认参数。
  函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  函数内容以冒号起始,并且缩进。
  return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
  语法:
  def func_name(parameters):
  func_suite
  return [expression]
  示例:定义一个函数,实现阶乘
def f(num):  
    fact = 1
  
    if num<0:
  
        return "No negative factorial"
  
    elif num==0:
  
        return 1
  
    for i in range(1,num+1):
  
        fact *= i
  
    return fact
  参数:
  调用函数时使用的函数类型:
  必备参数:
  调用函数时,必须以正确的顺序传入,并且传入的参数必须与声明的参数一致
>>> def hello(name):  
...     return 'hello '+name
  
...
  
>>> hello('world')
  
'hello world'
  关键字参数:
  关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
>>> def hello(name,age):  
...     return 'hello %s,your age is %s'%(name,age)
  
...
  

  
>>> hello(age=20,name='Alice')
  
'hello Alice,your age is 20'
  缺省参数:
  调用函数时,缺省参数的值如果没有传入,则使用预先定义的默认值。
>>> def hello(name,age=20):  
...     return 'hello %s,your age is %s'%(name,age)
  
...
  
>>> hello('Bob')
  
'hello Bob,your age is 20'
  不定长参数:
  你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数。
  *开头的参数,收集所有剩下的参数(位置参数),适用于元祖
  **开头的参数,收集所有剩下的参数(关键字参数),适用于字典
>>> def hello(name,*msg):  
...     return 'hello %s,your msg is %s'%(name,msg)
  
...
  
>>> hello('Catalina',20,'Female')
  
"hello Catalina,your msg is (20, 'Female')"
  匿名函数:
  lambda
  语法:lambda [arg1 [,arg2,.....argn]]:expression
  示例:写一个函数,求两个数字之和
>>> sum = lambda x,y:x+y  
>>> print sum(10,5)
  
15
  作用域:
  一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。函数内部变量,先在函数内部找,找不到才会去全局找,内部变量想修改为全局变量,只需用global声明一下。多个函数之间尽量避免使用全局变量
  示例:
#!/usr/bin/python  
#coding: utf-8
  

  
total = 0                                              #这是一个全局变量
  
def sum(arg1,arg2):
  
   total = arg1 + arg2                                 # total在这里是局部变量
  
   print "函数内是局部变量: ",total
  
   return total
  

  

  
sum(10,20)
  
print "函数外是全局变量: ",total
[root@test python]# python examp.py  
函数内是局部变量:  30
  
函数外是全局变量:  0
  将局部变量变为全局变量:
num = 100                                            # 全局变量  
def func():
  
    global num                                       # 使用global将局部变量定义为全局变量
  
    num = 200                                        # 局部变量
  
    print num
  

  
func()
  
print num
  结果:
[root@test python]# python examp3.py  
200
  
200
  四、使用函数对'二'中的练习进行改造
def oper_file(file_name):                            # 定义函数,根据访问数对ip、url排序  
    res = {}
  
    with open(file_name) as f:
  
        for line in f:
  
            tmp = line.split(' ')
  
            ip,url = tmp[0],tmp[6]
  
            res[(ip,url)] = res.get((ip,url),0)+1
  
    return sorted(res.items(),key=lambda x:x[1],reverse=True)
  

  
def get_html(arr):                                   # 将排序后的数据写成html格式
  
    tmpl = '<tr><td>No%s</td> <td>%s</td><td>%s</td><td>%s</td></tr>'
  

  
    html_str = '<h1>IP COUNT TABLE</h1>'
  
    html_str += '<table border="1px">'
  
    html_str += tmpl%(' ','IP','URL','COUNT')
  

  
    for index,value in enumerate(arr[:10]):
  
        html_str += tmpl%(index,value[0][0],value[0][1],value[1])
  
    html_str+='</table>'
  
    return html_str
  

  
def start_operate(file_name):                        # 将html格式的数据写入文件
  
    res = oper_file(file_name)
  
    with open('res.html','w') as f:
  
        f.write(get_html(res))
  

  
start_operate('access.log')
  html文件效果图:
DSC0000.png

  五、使用函数,对第三天的用户注册,登录功能进行改造
#!/usr/bin/python  
#coding:utf-8
  

  
service = raw_input('which service you want to choose,register or login: ').strip()
  

  
def file():
  
    name_list = []
  
    with open('user.txt') as fo:
  
        for msg in fo:
  
            msg_name = msg.strip('\n').split(':')[0]
  
            name_list.append(msg_name)
  
    return name_list
  

  
def test(arr):
  
    while True:
  
        name = raw_input('Please Input your name: ').strip()
  
        passwd = raw_input('Please Input your password: ').strip()
  
        repasswd = raw_input('Please Input your password again: ').strip()
  

  
        if not name:
  
            print 'Name can not be null'
  
            continue
  
        elif name in arr:
  
            print 'User already exist.'
  
            continue
  
        elif not passwd or passwd!=repasswd:
  
            print 'Wrong password'
  
            continue
  
        else:
  
            return name,passwd
  
            break
  

  
def write_in(name,passwd):
  
    with open('user.txt','a+') as fo:
  
        fo.write('%s:%s\n'%(name,passwd))
  
        print 'Registration completed'
  

  
def register():
  
    res = file()
  
    name,passwd = test(res)
  
    write_in(name,passwd)
  

  
def login():
  
    with open('user.txt') as fo:
  
        d = {}
  
        for user in fo:
  
            user_name = user.strip('\n').split(':')[0]
  
            user_passwd = user.strip('\n').split(':')[1]
  
            d[user_name] = user_passwd
  
    return d
  

  
def judge(arr):
  
    while True:
  
        name = raw_input('Please input your name: ').strip()
  
        passwd = raw_input('Please input your passwd: ').strip()
  

  
        if not name:
  
            print 'Name can not be null'
  
            continue
  
        elif name not in arr:
  
            print 'No such user'
  
            continue
  
        elif not passwd or passwd!=arr[name]:
  
            print 'Wrong password'
  
            continue
  
        else:
  
            print 'login successfully'
  
            break
  

  
def msg():
  
    if service=='login':
  arr = login()
  
     judge(arr)
  
    elif service=='register':
  register()
  
    else:
  print 'No other choice.'
  

  
msg()
  运行结果:
[root@test python]# python homework_04.py  
which service you want to choose,register or login: register
  
Please Input your name: hello
  
Please Input your password: 1234
  
Please Input your password again: 1234
  
Registration completed
  
[root@test python]# python homework_04.py
  
which service you want to choose,register or login: login
  
Please input your name: hello
  
Please input your passwd: 1234
  
login successfully

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-550538-1-1.html 上篇帖子: python 输出正方形 下篇帖子: Python中单元测试框架 Nose的安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表