Python学习day03

一、集合

与列表和元组不同,集合是无序的,也无法通过数字进行索引。此外,集合中的元素不能重复
创建集合:
    使用set函数

集合操作:
s = set([3,5,9,10])      #创建一个数值集合  

t = set("Hello")         #创建一个唯一字符的集合  

a = t | s          # t 和 s的并集  

b = t & s          # t 和 s的交集  

c = t – s          # 求差集(项在t中,但不在s中)  

d = t ^ s          # 对称差集(项在t或s中,但不会同时出现在二者中)

t.add(‘x‘)            # 添加一项  

s.update([10,37,42])  # 在s中添加多项  

t.remove(‘H‘)      #删除一项  

len(s)
set 的长度  

x in s
测试 x 是否是 s 的成员  

x not in s
测试 x 是否不是 s 的成员  

s.issubset(t)
s <= t
测试是否 s 中的每一个元素都在 t 中  

s.issuperset(t)
s >= t
测试是否 t 中的每一个元素都在 s 中  

s.union(t)
s | t
返回一个新的 set 包含 s 和 t 中的每一个元素  

s.intersection(t)
s & t
返回一个新的 set 包含 s 和 t 中的公共元素  

s.difference(t)
s - t
返回一个新的 set 包含 s 中有但是 t 中没有的元素  

s.symmetric_difference(t)
s ^ t
返回一个新的 set 包含 s 和 t 中不重复的元素  

s.copy()
返回 set “s”的一个浅复制  

s.update(t)
s |= t
返回增加了 set “t”中元素后的 set “s”  

s.intersection_update(t)
s &= t
返回只保留含有 set “t”中元素的 set “s”  

s.difference_update(t)
s -= t
返回删除了 set “t”中含有的元素后的 set “s”  

s.symmetric_difference_update(t)
s ^= t
返回含有 set “t”或者 set “s”中有而不是两者都有的元素的 set “s”  

s.add(x)  

向 set “s”中增加元素 x  

s.remove(x)  

从 set “s”中删除元素 x, 如果不存在则引发 KeyError  

s.discard(x)  

如果在 set “s”中存在元素 x, 则删除  

s.pop()  

删除并且返回 set “s”中的一个不确定的元素, 如果为空则引发 KeyError  

s.clear()  

删除 set “s”中的所有元素

二、函数

创建函数:
    def关键字
注意:return,在函数中,一旦执行return,函数执行过程立即终止

第一种:位置或关键字参数

这种参数是Python中默认的参数类型,定义这种参数后,可以通过位置参数,或者关键字参数的形式传递参数:

eg:

## 位置或者关键字参数
## 这个是Python的默认参数类型
## 示例:arg2提供了默认value
def func(arg1, arg2="World!"):
    print arg1, arg2

## func可以通过位置参数形式调用
func("Hello", "MitchellChu")

## 也可以通过关键字参数的形式来调用func
func(arg1="Hello", arg2="World!")

## 当然,混合的方式也是完全没有问题的
func("Hello", arg2="World!")

第二种方式:仅适用位置参数的形式

这种形式在需要将参数传递给函数(方法)时,仅能通过位置参数的传递方式。这种形式对于Python的开发者来说,暂时并没有办法使用。这种形式现在仅存在Python的很多内建的函数上:

eg:
## Positional-only parameter has no syntax to define
## 虽然无定义方法,但内建的很多函数都是仅接受位置参数的
abs(-3) ## correct
abs(a=3) ## wrong

## Traceback (most recent call last):
##   File "<stdin>", line 1, in <module>
## TypeError: abs() takes no keyword arguments

pow(x=2,y=3)
## Traceback (most recent call last):
##   File "<stdin>", line 1, in <module>
## TypeError: pow() takes no keyword arguments

pow(2,3)
## 8

 第三种:任意数量的位置参数(带单个星号参数)

任意数量的位置参数在定义的时候是需要一个星号前缀来表示,在传递参数的时候,可以在原有参数的后面添加任意多个参数,这些参数将会被放在元组内提供给函数(方法):

eg:
## var-positional parameter
## 定义的时候,我们需要添加单个星号作为前缀
def func(arg1, arg2, *args):
    print arg1, arg2, args

## 调用的时候,前面两个必须在前面
## 前两个参数是位置或关键字参数的形式
## 所以你可以使用这种参数的任一合法的传递方法
func("hello", "Tuple, values is:", 2, 3, 3, 4)

## Output:
## hello Tuple, values is: (2, 3, 3, 4)
## 多余的参数将自动被放入元组中提供给函数使用

## 如果你需要传递元组给函数
## 你需要在传递的过程中添加*号
## 请看下面例子中的输出差异:

func("hello", "Tuple, values is:", (2, 3, 3, 4))

## Output:
## hello Tuple, values is: ((2, 3, 3, 4),)

func("hello", "Tuple, values is:", *(2, 3, 3, 4))

## Output:
## hello Tuple, values is: (2, 3, 3, 4)

第四种:任意数量的关键字参数(带两个星号参数)

任意数量的关键字参数在定义的时候,参数名称前面需要有两个星号(**)作为前缀,这样定义出来的参数,在传递参数的时候,可以在原有的参数后面添加任意多个关键字参数,关键字参数是使用[参数名称=参数值]的形式进行传递:

eg:
## var-keywords parameter
## 定义的时候,需要两个星号作为前缀
def func(arg1, arg2, **kwargs):
    print arg1, arg2, kwargs

func("hello", "Dict, values is:", x=2, y=3, z=3)

## Output:
## 多余的参数将自动被放入字典中提供给函数使用

## 如果你需要直接传递字典给函数
## 你需要在传递的过程中添加**
## 此时如果还有关键字参数应在字典前提供完成
## 不能在字典后再提供
## 请看下面例子中的输出差异:

func("hello", "Dict., values is:", **{‘x‘:2, ‘y‘:3, ‘z‘:3})
## hello Dict., values is: {‘y‘: 3, ‘x‘: 2, ‘z‘: 3}

func("hello", "Dict., values is:", **{‘x‘:2, ‘y‘:3, ‘z‘:3,})
## hello Dict., values is: {‘y‘: 3, ‘x‘: 2, ‘z‘: 3}

func("hello", "Dict., values is:", {‘x‘:2, ‘y‘:3, ‘z‘:3})
## Traceback (most recent call last):
##   File "<stdin>", line 1, in <module>
## TypeError: func() takes exactly 2 arguments (3 given)

func("hello", "Dict., values is:", s=3, **{‘x‘:2, ‘y‘:3, ‘z‘:3,})
## hello Dict., values is: {‘y‘: 3, ‘x‘: 2, ‘s‘: 3, ‘z‘: 3}

## 提供了重复的参数
func("hello", "Dict., values is:", y=3, **{‘x‘:2, ‘y‘:3, ‘z‘:3,})
## Traceback (most recent call last):
##   File "<stdin>", line 1, in <module>
## TypeError: func() got multiple values for keyword argument ‘y‘

 总结:四种参数形式中仅有第二种Python没有提供定义的方法,其他三种在定义的时候也需要注意,定义的时候应该根据Python的解析规律进行定义,其中:

位置或关键字参数应该在最前面,其中,没有默认值的应该在有默认值的参数前面
任意数量位置参数应该放在所有位置或关键字参数的后面
任意数量关键字参数应该放在任意数量位置参数的后面
注意:任意数量位置参数和任意数量关键字参数只能在定义中定义一次。

三、三元运算及lamdba表达式

三元运算:
>>> 1 if True else 0
1
>>> 1 if False else 0
0
>>> "Fire" if True else "Water"
‘Fire‘
>>> "Fire" if False else "Water"
‘Water‘  

lamdba表达式:
lambda只是一个表达式,函数体比def简单很多。

lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。

f = lambda x,y,:x+y
f(2,3)
5

四、Python中的一些内置函数

abs()  取得绝对值
 all()   所有为真,才为真
 any()   只要有一个真,就为真
 ascii()  自动执行对象的__repr__方法

 bin()   将10进制转换为2进制
 oct()   将10进制转换为8进制
 hex()   将10进制转换为16进制

 bool()   判断值是True还是False

 bytes()  字符串转换字符类型

五、作业

#_*_coding:utf-8_*_
import json,collections

LINE_LIST = []     #配置文件中的每一行将作为一个元素,保存在该列表中
FILE_DICT = collections.OrderedDict()    #下方代码会将每个模块的头部与内容作为一个键值对添加到该有序字典中,以下称配置文件字典

file = open(‘ConfigFile‘,‘r‘)
for line in file.readlines():
    LINE_LIST.append(line)     #将每一行作为一个元素向line_list中追加,以下称line_list列表为配置文件列表
file.close()

for file_line in LINE_LIST:    #循环配置文件列表的每一行
    #以模块头部分类,头部作为键,值暂时设置为空列表,之后会将该模块的内容每一行作为一个元素添加到列表中
    if file_line[0:6] == ‘global‘ or file_line[0:8] == ‘defaults‘             or file_line[0:6] == ‘listen‘ or file_line[0:8] == ‘frontend‘ or file_line[0:7] == ‘backend‘:
        file_row = file_line    #用另一个变量记录下模块头部,方便下方添加值时,系统知道是为哪个模块添加
        FILE_DICT[file_line] = []
    elif file_line[0] == ‘ ‘ or file_line == ‘\n‘:  #如果该行的第一个字符为空,或者该行为‘\n‘,说明该行为模块的值
            FILE_DICT[file_row].append(file_line)   #那么将该行加入到相应的模块列表中

def write_in_file():
    """
    该函数用来将改变后的配置更新到配置文件中
    :return:
    """
    new_line_list = []   #该列表用来将改变后的配置文件字典中的键值对作为一个元素添加到列表中
    for k,v in FILE_DICT.items():
        #因为在配置文件字典中,值为一个列表,所以这里将值用join方法连起来
        new_line_list.append(‘%s%s‘ % (k, "".join(v)))   #将配置文件字典中的键值对作为一个元素添加到列表中

    with open(‘ConfigFile‘,‘w‘) as write_file:   #打开配置文件,将更新后的内容写到配置文件中
        for i in new_line_list:
                write_file.writelines(i)

def query_backend():
    """
    该函数用来获取haproxy配置文件中对应backend记录的值
    :return:   如果backend不存在,返回"该backend不存在",否则返回该backend记录的值
    """
    input_line = input("请输入backend:")       #让用户输入backend  如:www.oldboy.com
    #display_backend变量的格式将为 ‘backend www.oldboy.com\n‘  因为文件中就为该格式
    input_backend = ‘backend ‘ + input_line + ‘\n‘

    if input_backend in FILE_DICT.keys():    # #如果配置文件字典中存在用户输入的backend头部
        display_list = FILE_DICT[input_backend]   #将backend对应的值(一个列表)赋到一个变量上
        for i in display_list:
            return(i)       #输出每个元素
    else:      #如果配置文件字典中不存在用户输入的backend头部
        return("不存在该backend记录")

def add_backend():
    """
    该函数用来增加haproxy配置文件中对应backend记录的值,或者新建一个backend记录,并将对应值写到配置文件中
    :return:
    """
    add_backend = input("请输入要新加的backend记录:")
    #因为这个会用到json将用户输入的字符串格式转化要求的字典格式,会引发很多错误,所以这里用异常处理来避免因格式引起的错误
    try:
        #用户输入格式必须为{"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
        add_backend = json.loads(add_backend)  #用户输入的为字符串格式,通过json转化为字典格式
        #backend_title变量的格式将为 ‘backend www.oldboy.com\n‘  因为文件中就为该格式
        backend_title = "backend {0}\n".format(add_backend[‘backend‘])
        #content的格式为‘        server 100.1.7.9 100.1.7.9 weight 20 maxconn 30\n‘,文件中就为次格式
        content = "        server {0} {0} weight {1} maxconn {2}\n".format(add_backend["record"]["server"],
                                                                           add_backend["record"]["weight"],
                                                                           add_backend["record"]["maxconn"])
    except Exception as e:
        return("error")

    if backend_title in FILE_DICT.keys():    #如果配置文件字典中已存在用户输入的backend头部
        if content in FILE_DICT[backend_title]:  #并且值也存在
            return("已存在")
        else:    #如果值不存在
            FILE_DICT[backend_title].append(content)   #将值添加到配置文件字典中backend模块的值里(backend的值为一个列表)
            write_in_file()   #调用函数将最新内容写入磁盘
            return ("添加完成")
    else:  #如果配置文件字典中不存用户输入的backend头部
        FILE_DICT[backend_title] = [content]     #创建一个键值对,键为用户输入的backend头部,值为用户输入的backend值
        write_in_file()    #调用函数将最新内容写入磁盘
        return ("添加完成")

def del_backend():
    """
    该函数用来删除用户输入的在haproxy配置文件中的backend记录中的值
    :return:
    """
    del_backend = input("请输入要删除的backend记录:")
    #因为这个会用到json将用户输入的字符串格式转化要求的字典格式,会引发很多错误,所以这里用异常处理来避免因格式引起的错误
    try:
        #用户输入格式必须为{"backend": "test.oldboy.org","record":{"server": "100.1.7.9","weight": 20,"maxconn": 30}}
        del_backend = json.loads(del_backend)  #用户输入的为字符串格式,通过json转化为字典格式
        #backend_title变量的格式将为 ‘backend www.oldboy.com\n‘  因为文件中就为该格式
        backend_title = "backend {0}\n".format(del_backend[‘backend‘])
        #content的格式为‘        server 100.1.7.9 100.1.7.9 weight 20 maxconn 30\n‘,文件中就为次格式
        content = "        server {0} {0} weight {1} maxconn {2}\n".format(del_backend["record"]["server"],
                                                                           del_backend["record"]["weight"],
                                                                           del_backend["record"]["maxconn"])
    except Exception as e:
        return("error")

    if backend_title in FILE_DICT.keys():   #如果配置文件字典中存在用户输入的backend头部
        if content in FILE_DICT[backend_title]:    #并且值也存在
            FILE_DICT[backend_title].remove(content)   #在backend对应的列表中将该值删除
            if FILE_DICT[backend_title] == []:  #如果用户输入的backend头部对应的值为空,删除该backend记录
                del FILE_DICT[backend_title]
                write_in_file()   #调用函数将最新内容写入磁盘
                return "已删除(该backend记录中无任何值,已将该backend记录删除)"
            else:
                write_in_file()  #调用函数将最新内容写入磁盘
                return("已删除")
        else:     #如果值不存在
            return("该backend记录中不存在该值")
    else:     #如果配置文件字典中不存在用户输入的backend头部
        return("不存在该backend记录")

while True:
    USER_CHOICE = input("1、获取ha记录\n2、增加ha记录\n3、删除ha记录\n请输入你的选择(输入‘q‘退出):")
    if USER_CHOICE.strip().isdigit():   #判断用户输入是否为数字
        if USER_CHOICE == ‘1‘:     #如果用户输入1,调用query_backend()函数
            value = query_backend()
            print(value)
            break
        if USER_CHOICE == ‘2‘:     #如果用户输入2,调用add_backend()函数
            value = add_backend()
            if value == "error":
                print("你的输入数据格式有误,请重新输入")
                continue
            else:
                print(value)
                break
        if USER_CHOICE == ‘3‘:     #如果用户输入3,调用user_choice()函数
            value = del_backend()
            if value == "error":
                print("你的输入数据格式有误,请重新输入")
                continue
            else:
                print(value)
                break
        else:
            print("你的输入有误,请重新输入")
    elif USER_CHOICE == ‘q‘:    #如果用户输入q,结束循环
        break
    else:
        print("你的输入有误,请重新输入")

配置文件:

global
        log 127.0.0.1 local2
        daemon
        maxconn 256
        log 127.0.0.1 local2 info
defaults
        log global
        mode http
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms
        option  dontlognull

listen stats :8888
        stats enable
        stats uri       /admin
        stats auth      admin:1234

frontend oldboy.org
        bind 0.0.0.0:80
        option httplog
        option httpclose
        option  forwardfor
        log global
        acl www hdr_reg(host) -i www.oldboy.org
        use_backend www.oldboy.org if www

backend www.oldboy.org
        server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000

backend buy.oldboy.org
        server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000

六、作业流程图

时间: 2024-10-23 15:23:30

Python学习day03的相关文章

python学习-day03:整形、字符串常用方法:

一.数字,int 1.1: a.int(object)转化数字类型: a='100' b=int(a) b=b+1000 print(b) 223 <class 'int'> 答案 b.转化二进制: v=int(num,base=2) #number以二进制的形式转化为 10进制 num='0011'v=int(num,base=2)print(v) num='0011' v=int(num,base=16) print(v) num='b'v=int(num,base=16)print(v)

python学习:程序控制结构·作业20141219

Python学习:程序控制结构 20141219 编程环境: windows 7 x64 python 2.7.6 题目: 1 编写程序,完成下列题目(1分) 题目内容: 如果列出10以内自然数中3或5的倍数,则包括3,5,6,9.那么这些数字的和为23.要求计算得出任意正整数n以内中3或5的倍数的自然数之和. 输入格式: 一个正整数n. 输出格式: n以内中3或5的倍数的自然数之和. 输入样例: 10 输出样例: 23 时间限制:500ms内存限制:32000kb n = int(raw_in

python学习第二天

python学习的第二天就是个灾难啊,这天被打击了,自己写的作业被否认了,不说了,写博客还是个好习惯的,要坚持下去,就不知道能坚持到什么时候.呵呵!!! 这天教的知识和第一天的知识相差不大,区别在于比第一天讲的更细了(我们是两个老师教的,风格是不一样的),这次也写那些比较细的知识点. python的简介 (1)你的程序一定要有个主文件. (2)对于python,一切事物都是对象,对象基于类创建.#似懂非懂,不过有那么点似懂. 知识点 #__divmod__ 会把两个数字相除的商和余数以元组的方式

[Python 学习] 二、在Linux平台上使用Python

这一节,主要介绍在Linux平台上如何使用Python 1. Python安装. 现在大部分的发行版本都是自带Python的,所以可以不用安装.如果要安装的话,可以使用对应的系统安装指令. Fedora系统:先以root登入,运行 yum install python Ubuntu系统:在root组的用户, 运行 sudo apt-get install python 2. 使用的Python的脚本 Linux是一个以文件为单位的系统,那么我们使用的Python是哪一个文件呢? 这个可以通过指令

python学习之最简单的用户注册及登录验证小程序

文章都是从我的个人博客上粘贴过来的哦,更多内容请点击 http://www.iwangzheng.com 正如很多同学所知道的,楼主开始学习python了,前进的道路曲曲折折,有荆棘也有陷阱,从最简单的小程序写起,每天练习,将python进行到底. 有一点比较别扭的就是python的换行之后空四个空格,ruby都是两个,并且python在方法和循环语句的第一句都要加冒号 mysql> show create table user; mysql> alter table user add sal

python学习--创建模块

昨天做了python客户端和服务器端通信,并把接收到的信息写到数据库,因为对数据库进行操作是个经常调用的行为,所以我想把调用数据库的操作写成一个module来给其它python程序调用,所以将昨天的服务器端程序拆分为两个文件: 1.主程序python.py #!/usr/bin/env python import socket import json import connmysql s = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) h

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho

Python学习day5作业-ATM和购物商城

Python学习day5作业 Python学习day5作业 ATM和购物商城 作业需求 ATM: 指定最大透支额度 可取款 定期还款(每月指定日期还款,如15号) 可存款 定期出账单 支持多用户登陆,用户间转帐 支持多用户 管理员可添加账户.指定用户额度.冻结用户等 购物车: 商品信息- 数量.单价.名称 用户信息- 帐号.密码.余额 用户可充值 购物历史信息 允许用户多次购买,每次可购买多件 余额不足时进行提醒 用户退出时 ,输出当次购物信息 用户下次登陆时可查看购物历史 商品列表分级显示 1

Python学习记录day6

Python学习记录day6 学习 python Python学习记录day6 1.反射 2.常用模块 2.1 sys 2.2 os 2.3 hashlib 2.3 re 1.反射 反射:利用字符串的形式去对象(默认)中操作(寻找)成员 cat commons.py #!/usr/bin/env python#_*_coding:utf-8_*_''' * Created on 2016/12/3 21:54. * @author: Chinge_Yang.''' def login(): pr