美文网首页
python学习笔记02

python学习笔记02

作者: 单身狗的清香 | 来源:发表于2018-05-20 16:11 被阅读7次

    二进制

    二进制是计算技术中广泛采用的一种数制二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。
    常用进制转换的实现

    十进制到二进制:
    
    def dec2bin(num):
        l = []
        if num < 0:
            return '-' + dec2bin(abs(num))
        while True:
            num, remainder = divmod(num, 2)
            l.append(str(remainder))
            if num == 0:
                return ''.join(l[::-1])
    十进制到八进制:
    
    def dec2oct(num):
        l = []
        if num < 0:
            return '-' + dec2oct(abs(num))
        while True:
            num, remainder = divmod(num, 8)
            l.append(str(remainder))
            if num == 0:
                return ''.join(l[::-1])
    十进制到十六进制:
    
    base = [str(x) for x in range(10)] + [ chr(x) for x in range(ord('A'),ord('A')+6)]
    def dec2hex(num):
        l = []
        if num < 0:
            return '-' + dec2hex(abs(num))
        while True:
            num,rem = divmod(num, 16)
            l.append(base[rem])
            if num == 0:
                return ''.join(l[::-1])
    

    ASCII码

    在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)、以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

    美国标准信息交换代码是由美国国家标准学会(American National Standard Institute , ANSI )制定的,标准的单字节字符编码方案,用于基于文本的数据。起始于50年代后期,在1967年定案。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,它已被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母。
    以下代码用于实现ASCII码与字符相互转换:

    # 用户输入字符
    c = input("请输入一个字符: ")
    
    # 用户输入ASCII码,并将输入的数字转为整型
    a = int(input("请输入一个ASCII码: "))
    
    
    print( c + " 的ASCII 码为", ord(c))
    print( a , " 对应的字符为", chr(a))
    执行以上代码输出结果为:
    
    python3 test.py 
    请输入一个字符: a
    请输入一个ASCII码: 101
    a 的ASCII 码为 97
    101  对应的字符为 e
    

    深浅copy

    python中的深拷贝和浅拷贝和java里面的概念是一样的,所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝。
    首先,对赋值操作我们要有以下认识:

    赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 )。
    修改不可变对象(str、tuple)需要开辟新的空间
    修改可变对象(list等)不需要开辟新的空间
    浅拷贝仅仅复制了容器中元素的地址

    a=['hello',[1,2,3]]
    b=a[:]
    [id(x) for x in a]
    [55792504, 6444104]
    [id(x) for x in b]
    [55792504, 6444104]
    a[0]='world'
    a[1].append(4)
    print(a)
    ['world', [1, 2, 3, 4]]
    print(b)
    ['hello', [1, 2, 3, 4]]
    

    这里可以看出,未修改前,a和b中元素的地址都是相同的,不可变的hello
    和可变的list地址都一样,说明浅拷贝知识将容器内的元素的地址复制了一份。这可以通过修改后,b中字符串没改变,但是list元素随着a相应改变得到验证。

    浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。

    深拷贝,完全拷贝了一个副本,容器内部元素地址都不一样

    from copy import deepcopy
    a=['hello',[1,2,3]]
    b=deepcopy(a)
    [id(x) for x in a]
    [55792504, 55645000]
    [id(x) for x in b]
    [55792504, 58338824]
    a[0]='world'
    a[1].append(4)
     
    print(a)
    ['world', [1, 2, 3, 4]]
    print(b)
    ['hello', [1, 2, 3]]
    

    这里可以看出,深拷贝后,a和b的地址以及a和b中的元素地址均不同,这是完全拷贝的一个副本,修改a后,发现b没有发生任何改变,因为b是一个完全的副本,元素地址与a均不同,a修改不影响b。

    深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。
    转自:https://www.jianshu.com/p/efa9dd51f5cc

    字符串

    字符串是 Python 中最常用的数据类型。我们可以使用引号('或")来创建字符串。
    创建字符串很简单,只要为变量分配一个值即可。例如:

    var1 = 'Hello World!' 
    ## Python 访问字符串中的值
    
    Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用。
    
    Python 访问子字符串,可以使用方括号来截取字符串,如下实例:
    
    ## 实例(Python 3.0+)
    
    #!/usr/bin/python3
     
    var1 = 'Hello World!'
    var2 = "Runoob"
     
    print ("var1[0]: ", var1[0])
    print ("var2[1:5]: ", var2[1:5])
    

    Python字符串更新
    你可以截取字符串的一部分并与其他字段拼接,如下实例:

    #!/usr/bin/python3
    var1 = 'Hello World!'
    print ("已更新字符串 : ", var1[:6] + 'Runoob!')
    
    转义字符 描述
    (在行尾时) 续行符
    \ 反斜杠符号
    ' 单引号
    " 双引号
    \a 响铃
    \b 退格(Backspace)
    \e 转义
    \000
    \n 换行
    \v 纵向制表符
    \t 横向制表符
    \r 回车
    \f 换页
    \oyy 八进制数,yy代表的字符,例如:\o12代表换行
    \xyy 十六进制数,yy代表的字符,例如:\x0a代表换行
    \other 其它的字符以普通格式输出

    Python转义字符
    在需要在字符中使用特殊字符时,python用反斜杠()转义字符。如下表:

    转义字符 描述
    (在行尾时) 续行符
    \ 反斜杠符号
    ' 单引号
    " 双引号
    \a 响铃
    \b 退格(Backspace)
    \e 转义
    \000
    \n 换行
    \v 纵向制表符
    \t 横向制表符
    \r 回车
    \f 换页
    \oyy 八进制数,yy代表的字符,例如:\o12代表换行
    \xyy 十六进制数,yy代表的字符,例如:\x0a代表换行
    \other 其它的字符以普通格式输出

    作业

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # Created by master on  2018/5/16 14:22.
    
    
    class Menu(object):
        d_menu = {
            '北京': {
                '海淀': {
                    '五道口': {
                        'soho': {},
                        '网易': {},
                        'google': {}
                    },
                    '中关村': {
                        '爱奇艺': {},
                        '汽车之家': {},
                        'youku': {},
                    },
                    '上地': {
                        '百度': {},
                    },
                },
                '昌平': {
                    '沙河': {
                        '老男孩': {},
                        '北航': {},
                    },
                    '天通苑': {},
                    '回龙观': {},
                },
                '朝阳': {},
                '东城': {},
            },
            '上海': {
                '闵行': {
                    "人民广场": {
                        '炸鸡店': {}
                    }
                },
                '闸北': {
                    '火车战': {
                        '携程': {}
                    }
                },
                '浦东': {},
            },
            '山东': {},
        }
        # 保存层级供返回使用
        into_menu = []
    
        # 下一层
        def parse_level(self, d):
            for k, v in d.items():
                print(k, end="\t")
            print()
            child = input("选择子菜单:")
            if d.get(child) is not None:
                if len(d.get(child)) > 0 and d not in self.into_menu:
                    self.into_menu.append(d)
                    self.d_menu = d.get(child)
                else:
                    print("已经是最后一级了")
            else:
                print("子菜单不存在,请重新选择!")
                self.parse_level(d)
    
        # 上一层
        def last_menu(self):
            if len(self.into_menu) > 0:
                self.d_menu = self.into_menu.pop()
                for k, v in self.d_menu.items():
                    print(k, end="\t")
                print()
            else:
                print("已经到达最顶级了")
    
        # 命令区分
        def start(self):
            while True:
                p = input("输入命令:子菜单->q,返回上一层->w,退出->e\n")
                if p == "Q" or p == "q":
                    self.parse_level(self.d_menu)
                elif p == "W" or p == "w":
                    self.last_menu()
                elif p == "E" or p == "e":
                    exit("感谢使用,再见")
                else:
                    print("请输入正确的命令!")
    
    
    if __name__ == '__main__':
        m = Menu()
        m.start()
    
    

    相关文章

      网友评论

          本文标题:python学习笔记02

          本文链接:https://www.haomeiwen.com/subject/xcltjftx.html