python之路二

一.ipython安装教程

http://www.noanylove.com/2014/10/centos-6-5-sheng-ji-python-he-an-zhuang-ipython/

random

rc = ["石头","剪刀","布"]

for i in rc: print(rc.index(i),i)

颜色

颜色: 31是红色,32 是绿色 \033[31;1m内容\033[0m \033[31;1m内容\033[0m

3十几是前景色,40十几是背景色 \033[31;44;1m内容\033[0m 多写就好啦

二.列表

#!/usr/bin/env python
# -*- coding: utf-8 -*-
names = ["dailiang","guanjianyu","zhouxinyu"]

列表索引/下标

你可以通过索引/下标 来找到列表中每个元素的位置,记住索引是从0开始的 >>> names[0] #打印第一个下标 ‘dailiang‘

>>> names[1]  #打印第二个下标
‘guanjianyu‘

>>> names[-1]
‘zhouxinyu‘ #-1是最后一个变量

切片(顾头不顾尾)

你可以从列表中取出多个指定元素,这种操作叫切片

>>> names[0:1]
[‘dailiang‘]

>>> names[0:2]
[‘dailiang‘, ‘guanjianyu‘]

>>> names[0:3]
[‘dailiang‘, ‘guanjianyu‘, ‘zhouxinyu‘]

>>> names[1:3]
[‘guanjianyu‘, ‘zhouxinyu‘] 

>>> names[:-2]  #代表取0至倒数第二个,但是倒数第二个不显示
[‘dailiang‘]

列表中追加元素append,

In [2]: names.append("linan")
In [3]: names
Out[3]: [‘dailiang‘, ‘guanjianyu‘, ‘zhouxinyu‘, ‘linan‘]

插入

In [4]: names.insert(1,"zhangfenglai1")
In [5]: names
Out[5]: [‘dailiang‘, ‘zhangfenglai1‘, ‘guanjianyu‘, ‘zhouxinyu‘, ‘linan‘]

备注:你想在哪个索引位置插,就写哪个数字

修改

names [0] = ‘dailiang02‘

删除

names = ["dailiang","guanjianyu","zhouxinyu"]

del names[0]
或者  
names.remove("dailiang")
删除最后一个值
names.pop()

扩展(表与表的扩展与合并)

names = ["dailiang","guanjianyu","zhouxinyu"]

names02 = ["linshenwu","zhangfenglai","huqi"]

names.extend(names02)
[‘dailiang‘, ‘guanjianyu‘, ‘zhouxinyu‘, ‘linshenwu‘, ‘zhangfenglai‘, ‘huqi‘]

拷贝

names = ["dailiang","guanjianyu","zhouxinyu"]
lalal = names.copy()
这样lalal的内容就与names.copy一样了

获取长度

>>> len(names) #通过len()内置函数可以查看列表中元素的个数
3

统计

names.count("guanjianyu")
1

备注:这个可不是用来统计下标的,是统计这个列表list有几个guanjianyu

排序

names = ["dailiang","guanjianyu","zhouxinyu","linshenwu","linan"]

names.sort()
排序后:
[‘dailiang‘, ‘guanjianyu‘, ‘linan‘, ‘linshenwu‘, ‘zhouxinyu‘]

反转排序
names.reverse()

获取下标:

names.index("zhouxinyu")
0

例子:

In [9]: alist = ["l","la","lal"]

In [10]: for i in (alist) : print( alist.index(i),i)
0 l
1 la
2 lal

三.元组

元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表

yuanzu = (‘dailiang‘, ‘zhouxinyu‘, ‘linshenwu‘)

元组只有两个方式,一个是count,一个是index,完毕

四.购物车

这写既然都学完了,那么我们写一个购物车程序:

要求: 1.用户输入薪资,就会列出产品列表 2.用户根据商品编号选择商品,选择商品加入到已买列表中,并监测余额 3.退出打印已买商品列表,打印出已买list和余额

缩进可能会有问题,不要照着抄,要自己写啊

#!/usr/bin/env python
# -*- coding: utf-8 -*-

product_list = [
("iphone",5800),
("mac Pro",9800),
("bike",800),
("watch",10600),
("coffee",31),
("python",81)
]
shopping_list = []
salary = input("please input your salary: ")
if  salary.isdigit():
    salary = int(salary)
    while True:
        for i in product_list :
            print (product_list.index(i),i)

        user_choice = input("which you want to buy :")
        if user_choice.isdigit():
            user_choice = int(user_choice)
            if user_choice < len(product_list) and  user_choice >= 0 :
                p_i = product_list[user_choice]
                if p_i[1] <= salary:
                    shopping_list.append(p_i)
                    salary -= p_i[1]
                    print("added %s to your shopping cart, your current balance is \033[31;1m%s\033[0m " %(p_i[0],salary))
                    #     \033[32;1m内容\033[0m   32是绿色,31是红色
                else:
                    print("你的钱只剩\033[31;1m %s \033[0m 了,不够啊,买毛线%s啊" %(salary,p_i[0]))
            else:
                print("商品信息%s不存在" %(user_choice))

        elif user_choice == "q" :
            print("-----------------\033[31;1m您的购买清单是\033[0m------------")
            for p in shopping_list :
                print(p)
            print("\033[31;1m你的余额是\033[0m",salary)
            exit()
        else :
            print("invaild options")
else :
    print( "please insert into numbers")

五、字典操作

字典是一种"key-value"的数据类型,使用就像我们上课使用的字典,通过笔画、字母来查对应页的详细内容

#!/usr/bin/env python
# -*- coding: utf-8 -*-
info = {
"stu01" : "dailiang",
"stu02" : "guanjianyu",
"stu03" : "zhouxinyu",
"stu04" : "linan"
}

print(info)

查,永远使用的是key值取出value,但是不可以根据value取key

print(info["stu01"]) #这是根据key取出一个value
#print(info["dailiang"]) #但是不可以根据value取key

#print(info["stu05"]) #但是如果字典里面没有这个key,会报错的keyerror

print(info.get("stu05")) #推荐这个,如果没有不会报错,会返回None,一般推荐这样写

#判断一个key是不是在字典里
print("stu03" in info)
#返回值为True

改/增

info["stu02"] = "武藤兰"  #修改字典里的值,如果存在就会去修改,如果不存在就会去创建

info["stu05"] = "苍井空"  # 如果不存在就会去创建

print(info)
#{‘stu04‘: ‘linan‘, ‘stu02‘: ‘武藤兰‘, ‘stu05‘: ‘苍井空‘, ‘stu01‘: ‘dailiang‘, ‘stu03‘: ‘zhouxinyu‘}

#两种删除方法del与字典.pop
del info["stu01"]
print(info)
#{‘stu04‘: ‘linan‘, ‘stu05‘: ‘苍井空‘, ‘stu03‘: ‘zhouxinyu‘, ‘stu02‘: ‘武藤兰‘}

info.pop("stu02")
print(info)

#info.pop("zhouxinyu")  #info.pop只能删除key值啊
#print(info)

.setdefault()

字典里的setdefault是说如果原来有这个key值,就把默认值返回,如果没有这个key值,那就创建一个新的key,并赋值
#info.setdefault()
info.setdefault("stu01","huqi")
print(info)
{‘stu04‘: ‘linan‘, ‘stu01‘: ‘dailiang‘, ‘stu03‘: ‘zhouxinyu‘, ‘stu02‘: ‘guanjianyu‘}

info.setdefault("stu05","huqi")
print(info)
{‘stu04‘: ‘linan‘, ‘stu01‘: ‘dailiang‘, ‘stu05‘: ‘huqi‘, ‘stu03‘: ‘zhouxinyu‘, ‘stu02‘: ‘guanjianyu‘}

.update 合并字典

#!/usr/bin/env python
# -*- coding: utf-8 -*-
info = {
"stu01" : "dailiang",
"stu02" : "guanjianyu",
"stu03" : "zhouxinyu",
"stu04" : "linan"
}

a = {
"stu06" : "zhangfenglai",
"stu07" : "lalala"
}

info.update(a)
print(info)
{‘stu06‘: ‘zhangfenglai‘, ‘stu01‘: ‘dailiang‘, ‘stu07‘: ‘lalala‘, ‘stu04‘: ‘linan‘, ‘stu02‘: ‘guanjianyu‘, ‘stu03‘: ‘zhouxinyu‘}

备注:合并字典,如果有就创建,没有就删除

六、多级字典

#!/usr/bin/env python
# -*- coding: utf-8 -*-
av_catalog = {
    "应用" : {
    "linux" : ["zookeeper","kafka"],
    "nginx" : ["rewrite","locate"],
    "tomcat": ["JVM","OPTS"],
    },

    "硬件" : {
    "存储·" : ["硬盘","raid"],
    "管理" : ["远程管理","ilo"],
    "冗余": ["绑定","bond"],
    },

    "数据库" :{
    "mysql":["备份","mysqldump"],
    "sqlserver":["管理","SQL客户端"],
    },

}

是不是乱了???是不是不知道自己写的是什么??

记住下面几个小区别

元组:()  

列表:[]  

字典{}

如果我要修改冗余项,想修改bond为 etrunk

av_catalog["硬件"]["冗余"][1] = "etrunk"

字典查找key值就是用[],就是["硬件"],["冗余"]

列表查找用下标了,就是[1]

print(av_catalog)

.items()

把字典转换成列表

print(info.items())
dict_items([(‘stu01‘, ‘dailiang‘), (‘stu03‘, ‘zhouxinyu‘), (‘stu07‘, ‘lalala‘), (‘stu04‘, ‘linan‘), (‘stu02‘, ‘guanjianyu‘), (‘stu06‘, ‘zhangfenglai‘)])

字典的循环

字典的循环其实与列表的循环是一样的

列表的循环:

    for i in product_list :  

        print (product_list.index(i),i)

字典的循环:

    for i in info :
        print (i,info[i])

三级菜单

data = {
    ‘北京‘:{
        "昌平":{
            "沙河":["oldboy","test"],
            "天通苑":["链家地产","我爱我家"]
        },
        "朝阳":{
            "望京":["奔驰","陌陌"],
            "国贸":{"CICC","HP"},
            "东直门":{"Advent","飞信"},
        },
        "海淀":{},
    },
    ‘山东‘:{
        "德州":{},
        "青岛":{},
        "济南":{}
    },
    ‘广东‘:{
        "东莞":{},
        "常熟":{},
        "佛山":{},
    },
}

文件对象读取open

open及file内建函数 作为打开文件之门的"钥匙",内建函数open()以及file()提供了初始化 输入/输出(I/O)操作的通用接口

成功打开文件后时候会返回一个文件对象,否则引发一个错误

文件对象访问模式

r 以只读方式打开(文件不存在则报错) w 以写方式打开 (文件存在则&清空,文件不存在则创建) a 以追加模式打开(必要时创建新文件) r+ 以读写模式打开(参加r+) w+ 以读写模式打开(参见w) a+ 已读写模式打开(参见a)

b :windows下需要加一个b,比如rb wb等

第一个例子:

1.先open一个文件
f = open("/etc/hosts")  #如果open后面不加东西的话,默认是以 f = open.("/etc/hosys","r")模式打开
2.读文件数据
data = f.read()        
print(data)
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
3.关闭文件
f.close()  #关闭文件

为什么要关闭呢?? 因为读文件需要指针,读完一行,指针就会放到第二行,下次你再次读取就会从第二行开始读,这样就读不全,所以我们重复读 一个文件就需要把先把文件 f.close()

read方法

read()方法用来直接读取字节到字符串中

readline方法

读取一行

例子总结

[[email protected] ~]# vim /etc/passwd 
1 root:x:0:0:root:/root:/bin/bash  
2 bin:x:1:1:bin:/bin:/sbin/nologin   
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin  
4 adm:x:3:4:adm:/var/adm:/sbin/nologin  
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin  
6 sync:x:5:0:sync:/sbin:/bin/sync  
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown  
8 halt:x:7:0:halt:/sbin:/sbin/halt  
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin  
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin  
11 operator:x:11:0:operator:/root:/sbin/nologin
12 games:x:12:100:games:/usr/games:/sbin/nologin

上图是这个文件:

f= open("/etc/passwd")

f.read(10)  #只读10个字节
‘root:x:0:0‘ 

f.readline() #一行一行的读,每次读一行
‘:root:/root:/bin/bash\n‘

f.readlines() #把指针后面所有的读出来,以列表的形式

例子:

f= open("/etc/hosts")
f.readlines()
[‘127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4\n‘,
‘::1         localhost localhost.localdomain localhost6 localhost6.localdomain6\n‘]
可以看到是以列表的形式读出来的啊

文件迭代:

如果需要逐行处理文件,可以结合for循环迭代文件

f = open("/etc/hosts") 
for i in f :  print (i)

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

文件输入write()

write()内建方法功能与read()和readline()功能相反,它把含有文本数据或者二进制数据块的字符串写入到文件爱你中去 写入文件时,不会自动添加行结束符或者换行符,需要程序员自己手动添加

下面我们来做一个写操作的例子

linux操作系统进入到/opt 打开python 执行

f = open("a.txt")
---------------------------------------------------------------------------                       
FileNotFoundError: [Errno 2] No such file or directory: ‘a.txt‘

发现报错,因为** open("文件") = open("文件","r") **,r是文件不存在则无法创建
所以我们要换一种方式来
f = open("a.txt","w") 这样进入/opt 目录发现创建了a.txt这个文件
执行

f.write("111\n222\n")
f.flush() #这样就会写入磁盘啦,你就可以在文件中看到啦
111
222

writelines参数需要你使用列表的形式才行,上面readlines也是以列表形式输出
f.writelines(["2222\n","33333\n"])

f.read()
---------------------------------------------------------------------------
UnsupportedOperation: not readable
发现报错,因为创建时w 权限,只可以写不可以读

ok,那么现在问题来了
如果我以f = open ("文件","r") 的方式打开文件不能写入
如果我以f = open("文件","w")的方式打开文件则会清空原文件
如果我想要在文件后面追加呢???

a 以追加模式打开(必要时创建新文件)
a+ 已读写模式打开(参见a)

文件操作总结

这里不做详细介绍了,直接上例子

模拟cp操作: 1.创建~/bin/cp.py 文件
2.将/bin/ls "拷贝到"/root/ 目录下 
3.要求读取/bin/ls 后,每次读取4096字节,依次写入到新文件
4.不要修改原始文件

!/usr/bin/env python

coding: utf8

import sys import os f = open("cp.py","a") b = open("/etc/hosts","r") while True: c = b.read(4096) if c: f.write(c) f.flush() else: break

f.close() b.close()

时间: 2024-08-07 00:03:54

python之路二的相关文章

python之路二十

一, $.ajax,这个是JQuery对ajax封装的最基础步,通过使用这个函数可以完成异步通讯的所有功能.也就是说什么情况下我们都可以通过此方法进行异步刷新的操作.但是它的参数较多,有的时候可能会麻烦一些.看一下常用的参数: var configObj = { method   //数据的提交方式:get和post url   //数据的提交路劲 async   //是否支持异步刷新,默认是true data    //需要提交的数据 dataType   //服务器返回数据的类型,例如xml

python之路二十二

Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 相当于我们创建了一个hook. 1. Django的内置信号 Model signals    pre_init                    # django的modal执行其构造方法前,自动触发    post_init                   # django的modal执行其构造方法后,自动触发    pre_save    

python之路二十一

URL        - 两个    Views        - 请求的其他信息        from django.core.handlers.wsgi import WSGIRequest        request.environ        request.environ['HTTP_USER_AGENT']        - 装饰器            FBV:                def auth(func):                    def inn

2017年12月14日 一个Java开发的Python之路----------------(二)

说一个收获最大的,就是这个关闭流对象 之前写java读取文件的时候,最后往往要关闭流对象,以前我一直不明白,为什么,我不使用.close()方法,文件也可以读取成功,总感觉没有什么意义 原来是因为,这个.close()方法,不是给java文件,或者python文件执行的,因为关于文件对象的操作,都是由操作系统去完成的 这个打开,read,和close都是告诉操作系统要执行,至于这个close()是告诉操作系统,说我的文件执行完了,可以回收资源了. 当然你不写关闭,对读写都没有什么影响,但是,可能

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.

Python之路第一课Day9--随堂笔记之二(进程、线程、协程篇)

本节内容 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 一.进程与线程 1.线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务 A thread is an ex

Python之路【第十七篇】:Django【进阶篇 】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc

七日Python之路--第十二天(Django Web 开发指南)

<Django Web 开发指南>.貌似使用Django1.0版本,基本内容差不多,细读无妨.地址:http://www.jb51.net/books/76079.html (一)第一部分 入门 (1)内置数字工厂函数 int(12.34)会创建一个新的值为12的整数对象,而float(12)则会返回12.0. (2)其他序列操作符 连接(+),复制(*),以及检查是否是成员(in, not in) '**'.join('**')   或  '***%s***%d' % (str, int)