我的python学习--第四天

一、首先是对前三天的学习内容进行复习

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[i][1] > res_list[i+1][1]:
            res_list[i],res_list[i+1]=res_list[i+1],res_list[i]
‘‘‘

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
[[email protected] python]# python examp.py
函数内是局部变量:  30
函数外是全局变量:  0

将局部变量变为全局变量:

num = 100                                            # 全局变量
def func():
    global num                                       # 使用global将局部变量定义为全局变量
    num = 200                                        # 局部变量
    print num

func()
print num

结果:

[[email protected] 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文件效果图:

时间: 2024-10-14 13:42:18

我的python学习--第四天的相关文章

python学习第四十八天json模块与pickle模块差异

在开发过程中,字符串和python数据类型进行转换,下面比较python学习第四十八天json模块与pickle模块差异. json 的优点和缺点 优点  跨语言,体积小 缺点 只能支持 int str list tuple dict pickle 的优点和缺点 优点 专门为python设计,支持python所有的数据类型 缺点 只能python使用,存储数据占空间大 文章来自 www.96net.com.cn 原文地址:https://www.cnblogs.com/96net/p/97806

Python学习第四天学习写的小案例(主要是针对 分支/循环的学习)

Python学习第四天学习写的小案例 (2019/07/17) 第一题:使用while循环输出1 2 3 4 5 6 8 9 10 程序代码: s = 0 while s<10: if s==6: s += 1 # 当数字为7的时候输出一个空格出来 print(end=' ') continue s += 1 print(s,end=' ') 运行结果: 1 2 3 4 5 6 8 9 10 第二题: 求1-100的所有数的和 程序代码: count = 0 for i in range(101

python学习-第四天补充-面向对象

python学习-第四天补充-面向对象 python 私有 --name mangling(名字修改.名字) 在命名时,通过使用两个下划线作为开头,可以使得这个变量或者函数编程私有的,但是这个其实的python的伪私有,实际是python通过名字修改来进行的,python会把这样命名的变量或者函数名改为_类名__变量名 class A: __name="hello" t = A(); #print(t.__name) #这样会出现错误,错误提示说这个变量没有__name类型 print

Python学习(四)cPickle的用法

python中有两个类似的:pickle与cPickle:两者的关系:“cPickle – A faster pickle” pickle模块中的两个主要函数是dump()和load().dump()函数接受一个文件句柄和一个数据对象作为参数,把数据对象以特定的格式保存到给定的文件中.当我们使用load()函数从文件中取出已保存的对象时,pickle知道如何恢复这些对象到它们本来的格式. cPickle可以对任意一种类型的python对象进行序列化操作,比如list,dict,甚至是一个类的对象

Python学习十四:filter()

Python 中内置了filter()函数用于过滤序列. 用法: filter()接收一个函数和一个序列.filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素. demo: 1.在一个list中,删掉偶数,只保留奇数: #filter odd number in the list def is_odd(n): return n % 2 == 1 print filter(is_odd , [1 , 2 , 3 , 4 , 5 , 6 , 9

Python 学习第四弹:编码问题(转载)

关于python的编码问题一直以来不得解,终于在今天从这篇博文中明白了. 原文地址: http://nedbatchelder.com/text/unipain.html 译文地址:http://pycoders-weekly-chinese.readthedocs.org/en/latest/issue5/unipain.html 译者: yudun1989 实用Unicode编程指南 这是我在 Pycon2012 所做的演讲.你可以阅读本页的幻灯片和文字,或者直接在浏览器中打开 演示 ,或者

Python学习笔记(四)

一.list创建 list 是Python语言中一种内置的数据类型 list 中可以存放不同类型的数据 list = []  #创建一个空列表 list = [1,2,3] #创建一个非空列表,并初始化其元素为1,2,3 二.list长度 使用 len(list_变量) 可以测得list的长度 三.list切片 list = [1,2,3,4,5,6,7,8,9,10] print(list[3:])  #4,5,6,7,8,9,10 print(list[3:5]) #4,5 print(li

python学习笔记(四):函数

一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method. 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 二.使用函数的好处: 1.简化代码2.提高代码的复用性3.代码可扩展 三.p

迭代器与函数Python学习(四)

1.1 迭代器: 迭代的工具 1.1.1 什么是迭代: 指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果是下一次重复的初始值 while True: print('=====>') l=['a','b','c'] count=0 while count < len(l): print(l[count]) count+=1   1.1.2 为什么要有迭代器? 对于序列类型:str,list,tuple,可以依赖索引来迭代取值, 但是对于dict,set,文件,python必须为