zoukankan      html  css  js  c++  java
  • python基础

    切片:

    name[起始位置:终止位置:每取一个后加的步子的长度]

    name[::-1] 表示逆序

    name[-1:0:-1] 会取不到第一个数

    name[-1::-1] = name[::-1] 都会逆序

     列表添加三种方式:

    name = []

    1.name.append('')添加一个元素

    2.name = name1 + name2 两个列表相加

    3 name.extend(name1) 在原来的列表的基础上加上name1, name1和name的类型相同

    删除元素

    1 name.pop() 删除最后一个

    2 remove() 根据内容删除

    3 del name[0] 根据下表删除

    删除字典:

    del info['QQ']

    info.get(' ') 如果没有的时候会返回空,不至于让程序崩溃

    for num in nums:
        print(num)
    else:
        print('end') #else等for循环执行完才会执行, end一定会打印,除非print(num)后面加一个break

    元组

    不能修改里面的内容。

    python 2.7从控制台输入用

    message = raw_input("input:")

    函数:

    不定长函数 *args

    #a,b是需要要有值得,args是后面的所有,最后是一个元组
    def test(a, b, *args):
        pass
    
    test(1,2,3,4)
    test(1,2)

    不定长函数 **kwargs

    #当调用函数时,以变量名+值得形式当参数来调用时,会将所有的内容都传给kwargs,最后的结果是字典的形式
    
    def test(a, b, *args, **kwargs):
        print(a)
        print(b)
        print(args)
        print(kwargs)
    
    test(1,2,3,4,task=89,done=20)
    
    最后结果:
    1
    23,4)
    {‘task':89, 'done':20}

    #拆包
    c=(1,2,3,4)
    dict = {'task':89, 'done':20}
    test(1,2,c,dict) #会将c和dict里面的内容拆开,分别赋给args, kwargs

    关于 * 和 **

    1、如上例所述,定义函数作为函数的参数,参数为*args,传入的args将是一个tuple, 参数为**kwargs, 传入的kwargs是一个字典

    2、当调用函数时作为参数时,也会args也是一个tuple,只不过,是将传入的数组一个一个的放到tuple,而不是将数组当初tuple的一个元素,**kwargs时,要求输入内容为字典,key为函数形参,value为参数值

    def sum(*args):
        print args
    
    val = (1,2)
    sum(val) //作为一个整体
    sum(*val) //一个一个
    
    ----------output------------
    ((1, 2),)
    (1, 2)

     python引用

    a = 1
    b = a
    #此时表示a 和 b同时纸箱某个内存的位置
    #打印出a,b值会发现此时的内存地址是相同的
    id(a)
    id(b)
    a = 2 #此时a又指向另一个内存的位置

     变量名:

    实例变量:以_开头,其他和普通变量一样 

    私有实例变量(外部访问会报错): 
    以__开头(2个下划线),其他和普通变量一样 
    __private_var 

     字符串的操作:

    1.find

    2.join

    3.split()不加值时按照不可见字符删除

    collections

    1、Counter

    >>> c = Counter('gallahad') # 从一个可iterable对象(list、tuple、dict、字符串等)创建
    更新: c.update()
    删除: c.substract()

     

    第九章类

    在python中,如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问

    class Student(object):
    
        def __init__(self, name, score):
            self.__name = name
            self.__score = score
    

     

    第十章文件和异常

    1、从文件中读取

       三种方式:read, readline, readlines

       read: 全部读取形成一个str

       readline(): 每次读取一行,比readlines()慢得多;readline()返回的是一个字符串对象,保存当前行的内容

        readlines():一次读取全部文件,自动将文件内容形成一个行的内容

    with open('pi_digits.txt') as file_object:
        """读取整个文件
        contents = file_object.read()
        print(contents.rstrip())
        逐行读取
        for line in file_object:
            print(line.rstrip())
        创建一个包含文件各行内容的列表
        """
        lines = file_object.readlines()
    for line in lines:
        print(line.rstrip())

     f = open('xxxxxx.txt', 'r+')
     f.read()
     'hahahaha
    '
     #read(n) 表示每次读取 n 个字节
    f.read(
    1) '' #seek用来调整当前的指针,0表示文件开头,2表示文件末尾
    f.seek(0,0) #返回文件开头 f.read(
    1) 'h' f.read(1) 'a' f.read(1) 'h' f.seek(0,2) f.read(1) '' f.write('jjjjjjjjjjj') f.read() '' f.seek(0, 0) f.read() 'hahahaha jjjjjjjjjjj'

    2、写入文件

    open(),两个实参,第一个实参是打开文件的名称,第二个实参是打开的模式。 r (默认),w, a

    with open(filename, 'a') as file_object:
        file_object.write("l also love finding meaning in large datasets.
    ")
        file_object.write("l love creating apps that can run in a browser.
    ")

    3批量对文件命名(os)

    import os
    #1get all folder 
    folder_name = input('input folder:')
    #2get all file
    file_names = os.listdir(folder_name)
    #2rename
    #os.chdir(folder_name)
    for file_name in file_names:
        #print(file_name)
        old_file_name = './' + folder_name + '/' + file_name
        new_file_name = './' + folder_name + '/[h]' +  file_name
        os.rename(old_file_name, new_file_name)

    1、map 和 reduce,fliter

      

    #map是对列表里的每一个数进行映射
    ret = map(lambda x : x * x , [1, 2, 3])
    
     ret
     [1, 4, 9]
    #fileter是第一个条件满足的则会留下来
    In [9]: ret = filter(lambda x: x % 2, [1, 2, 3, 4])
    
    In [10]: ret
    Out[10]: [1, 3]
    #如果改成map则只会取值
    In [11]: ret = map(lambda x: x % 2, [1, 2, 3, 4])
    
    In [12]: ret
    Out[12]: [1, 0, 1, 0]
    
    #reduce会对每一个元素进行累加
    In [14]: reduce(lambda x,y: x + y, ['aa', 'bb', 'cc'], 'dd')
    Out[14]: 'ddaabbcc'

    2、匿名函数 lambda

       

    f = lambda x: x * x
        匿名函数默认带有return,
     f(3)  会打印出9

    匿名函数的应用(一)
    对字典的内容排序

    In [2]: stu = [ { 'name':'zhongha', 'age':10}, { 'name':'aongha', 'age':13}, { '
    ...: name':'dongha', 'age':11} ]

    In [3]: stu.sort(key=lambda info:info['name'])

    In [4]: stu
    Out[4]:
    [{'age': 13, 'name': 'aongha'},
    {'age': 11, 'name': 'dongha'},
    {'age': 10, 'name': 'zhongha'}]

    匿名函数的应用二

    >>> def test(a, b, func):
    ... result = func(a, b)
    ... print(result)
    ...
    >>> test(11, 22, lambda x, y: x + y)
    33

    匿名函数应用三

    def test(a, b, func):
    result = func(a, b)
    print(result)
    func_new = input("input a function:")
    func_new = eval(func_new) #python 3需要该函数,将字符串的引号去掉
    test(11, 22, func_new)



    补充知识1 全局变量
    a = 100 #整数型的全局变量不可变,所以在test函数中会重现创建要给值 b = [100]#列表的全局变量是可变的,所以test函数中会自动改便b的值 def test(num): num += num print (num) test(a) print(a) test(b) print(b)
    补充知识2 交换
    交换a,b的值
    方法一
    a = a + b
    b = a - b
    a = a - b
    方法二
    a,b = b,a

     

    3、装饰器,用来在函数调用前输出一些信息

    def debug2(func):
        def wrapper(*args, **kwargs):  #可以包含多个参数
            print "[debug]:enter{}()".format(func.__name__)
            print "Prepare and say..."
            return func(*args, **kwargs)
        return wrapper
    #装饰器原理
    def w1(func):
        def inner():
            print('----authorizing---')
            func()
        return inner
    
    def f1():
        print('---f1----')
    
    def f2():
        print('---f2----')
    
    f1 = w1(f1)
    f1()
    装饰时,先倒着装饰,到执行的时候是从上往下依次执行

     

     

     4、判断对象是否是某类的实例

        isinstance('abc', str)

    5、实例属性与类属性(java中的静态成员)

        实例属性:在__init__里面定义的属性,

        类属性:归类所有,在class中定义

       

    class Game(object):
        num = 0
        
        def __init__(self):
            self.name = 'laowang'
    
        #method 类方法需要加@classmethod, 参数需要添加cls
        @classmethod
        def add_num(cls):
            cls.num = 100
    
        #static method, 静态方法不用加参数
        def print_menu():
            print('----------------')
            print('-----hello------')
            print('----------------')
    
    game = Game()
    Game.add_num() #可以通过类和实例来调用类方法
    game.add_num()
    print(Game.num)
    
    Game.print_menu()

    6、MethodType:

        

    #!/usr/bin/env python
    # encoding: utf-8
    
    from types import MethodType
    
    #创建一个方法
    def set_age(self, age):
        self.age = age
    #创建一个类
    class Student(object):
        pass
    
    s = Student()
    s.name = 'Micle'
    print(s.name)
    from types import MethodType
    s.set_age = MethodType(set_age, s) #给实例绑定了一个方法,对于其他的实例不起作用
    s.set_age(10)
    print(s.age)
    
    Student.set_age = set_age #给类绑定了一个方法,所有的实例都会有该方法
    new1 = Student()
    new2 = Student()
    new1.set_age(11)
    new2.set_age(12)
    print(new1.age, new2.age)
    

    Python中调试技巧:

    引用 pdb

       import pdb
      4 s = '0'
      5 n = int(s)
      6 pdb.set_trace() #断点
      7 print(n / 0)

    p 变量名 :查看变量值

    c 继续执行

    ------------------------------------------

    面向对象

    1、方法一

         __init__(self):

    2、__str__(self):

         打印对象时,也是自定义输出内容

    3.__函数名(self): 

        私有方法

    4、__del__(self):

          对象删除时会自动调用

    5. __call__():

        调用对象(),会调用call方法

    6. __new__(cls):

        创建一个对象

    5、在子类中重写父类的方法时,仍需在调用父类的方法

         1、 Dog.bark(self)

         2、super().bark()

    class Dog(object):
        def __init__(self):
            print('---init---')
    
        def __del__(self):
            print('---del---')
    
        def __str__(self):
            print('---self---')
            return('str')
     
        def __new__(cls):
            print('---new---')
            return object.__new__(cls)
    
    xtq = Dog()
    当执行Dog()时,相当于做了三件事
    1.调用__new__方法来创建对象,然后找一个变量来接受__new__的返回值,这个返回值表示创建出来的对象的引用
    2.__init__(刚刚创建出来的对象的引用)
    3 返回对象的引用
    ---------------------------
    C++和Java中的构造函数是指创建对象并初始化,pyhont不存在构造函数,__new__用来创建对象__init__用来初始化
    #单例模式,只创建一个对象
    
    class Dog(object):
        __instance = None
        def __new__(cls):
            if cls.__instance == None:
                cls.__instance = object.__new__(cls)
                return cls.__instance
            else:
                return cls.__instance
    
    a = Dog()
    print(id(a))
    b = Dog()
    print(id(b))

    导入模块:

        sys

        imp中reload(模块名), 可以重新导入一个模块

    == 和 is

        == 表示两个值是否相等, is指的是内存地址是否相等

    深拷贝和浅拷贝:

    浅拷贝:a只是把地址给b

     深拷贝:由开辟一块内存给c,此时a,b指向同一块内存,c自己指向一块内存

    不管有什么内容都会重新拷贝

    copy.deepcopy()全部都会拷贝,copy.copy() 仅仅拷贝第一层

     


     在一个文件中,如果变量名包含下划线,改变了为私有属性

     property:

    num = property(getNum, setNum) 就可以通过 类名.num 来表示了

    判断是否可以迭代:

    from collections import Iterable
    isinstance([], Iterable)
    判断是否是迭代对象,可以迭代不一定是迭代对象
    from collections import Iterator
    isinstance([], Iterator)
    def test(number):
        print('---------1---------')
        
        def test_in(number2):
            print('--------2-------')
            print(number + number2) 
       
        print('-----------3----------')
        return test_in
    
    ret = test(100) #返回一个函数的引用
    print('-------------4----------')
    ret(1)

    闭包的应用(输出一个直线的值,相比传三个参数闭包写法更简单,写完之后a,b都已确定,再次调用只用写x的值)

    def test(a, b):
        def test_in(x):
        print(a * x + b)

    return test_in

    line1 = test(1, 1)
    line1(0)
    line2 = test(10, 4)
    line2(0)





     生成器:

     如果需要枚举很大的数,可以用生成器(产生一个数的算法),边生成遍枚举

    def create_num():
        print('----start----')
        a, b = 0,1
        for i in range(5):
            print('----1----')
            yield b
            print('----2----')
            a,b = b, a + b
            print('----3----')
        print('----end----')
    a = create_num()
    next(a)
    a.__next__()
    #当执行yield就会暂停一下,
    #利用生成器模拟多任务
    def
    test1(): while True: print('---1---') yield None def test2(): while True: print('---2---') yield None t1 = test1() t2 = test2() while True: t1.__next__() t2.__next__()
    
    
    
     

     元类

    def printNum(self):
        print("---num-%d---"%self.num)
    #type用来创建一个类,第一个参数是类名,第二个参数是父类,第三个参数是类属性
    Test3 = type('Test3', (), {'printNum':printNum})
    
    t1 = Test3()
    t1.num = 100
    t1.printNum()
    
    class printNum2:
        def printNum(self):
            print('---num-%d---'%self.num)
    
    t2 = printNum2()
    t2.num = 100
    t2.printNum()
    def upper_attr(future_class_name, future_class_parents, future_class_attr):
        
        newAttr = {}
        for name, value in future_class_attr.items():
            if not name.startswith('__'):
                newAttr[name.upper()] = value
    
        return type(future_class_name, future_class_parents, future_class_attr)
    #表示用upper_attr函数来创建一个类
    class Foo(object, metaclass=upper_attr):
        bar = 'bar'
    
    print( hasattr(Foo, 'bar'))
    print( hasattr(Foo, 'BAR'))

    python垃圾回收机制:

    小整数池: [5, 257) 常驻内存,不会被删除,

                      简单的字符串,不包含空格的复杂字符的 也会在固定的内存位置

    python垃圾回收机制 以引用计数为主,但是解决不了互相引用的问题, 隔代回收为辅

    内建属性

        python中通过对象调用方法或者变量时(t.num 或者 t.show()),总是会先调用__getattribute__方法,由该方法返回所调用内容的引用

    class ITcast(object):
        def __init__(self, subject):
            self.subject1 = subject
            self.subject2 = 'cpp'
    
        def __getattribute__(self, obj):
            print('====1>%s'%obj)
            if obj == 'subject1':
                print('log subject1')
                return 'redirect python'
            else:
                temp = object.__getattribute__(self, obj)
                print('====2>%s'%str(temp))
                return temp
    
        def show(self):
            print('this is Itcast')
    
    s = ITcast('python')
    print(s.subject1)
    print(s.subject2)
    s.show()
  • 相关阅读:
    Linux下使用mail发送邮件
    Thirft框架介绍
    当谈论设备指纹时,我们到底在说什么?(转)
    设备指纹(Device Fingerprinting)是什么?
    搭建RESTful API 之 实现WSGI服务的URL映射
    OpenStack设计与实现5——RESTful API和WSGI
    Charles使用
    iBeacon室内定位原理解析【转】
    docker安装
    chase
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/7224049.html
Copyright © 2011-2022 走看看