• Python基本知识


    安装Python之后有python解释器、命令行交互环境、简单的集成开发环境
    python交互环境下执行代码会自动打印结果,而.py文档必须用print()函数打印
    注释用#符号
    缩进决定结构
    路径用\分隔,如F:\xxx

    输入输出

    • print()会依次打印每个字符串,遇到逗号“,”会输出一个空格
    • input()返回输入的值,其参数可以作为提示信息输出
    • 输出多行:
    print('''可以
    输入多行
    字符串
    代替
    字符''')
    
    • 格式化输出:
    print('haha%dhah%s' % (55,'string'))
    
    • r'内部字符不转义',也就是按照引号内部的原本内容输出,取消转义字符的意义

    数据类型及运算符

    • python是动态语言,本身类型不固定,弱化数据类型,变量可以被赋给任意值
    • 类型转换:int('6') 将字符6转换成数字6,如果字符并非数字,则报错
    • 布尔运算符: and or not
    • 10/3结果为浮点数,10//3为整数,10//3.0强制取整数部分,但小数点后有一位0

    字符串及编码

    • python 中字符串采用unicode编码,内存中以字符为单位的str,保存到磁盘上需要用以字节为单位的bytes
    • 用encode()函数可以将str转化成bytes,如:'中文'.encode('utf-8') = b'xe4xb8xadxe6x96x87'
    • 用decode()函数可以将bytes转化成str,如:b'abc'.decode('ascii') = 'abc'
    • 纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。
    • 含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错。
    • len()函数,len('abc') = 3,len('中文'.encode('utf-8')) = 6

    序列

    list列表

    l = ['a','b','c']
    l.append('e')
    l.insert(3,'d')
    l.pop(0)
    

    list各元素可不同类型,也可以是list;l = ['x',y,z];

    • 增:append('element')--追加到末尾、insert(x , 'element')--指定索引号插入、
    • 删:pop(x)--删除元素;
    • 改:有序集合,按标号更改;
    • 查:可正负索引查内容,负标号表示倒数第几个,len()查长度

    tuple元组

    • 有序集合,初始化后固定不可改,但内嵌list的值可以更改;tuplename = ('x','y','z');可正负索引;
    • 定义只有一个元素的tuple:t = (1 , )消除歧义

    dict词典

    d = {'a':1, 'b':2, 'c':3}
    d['d'] = 4
    d.pop('d')
    d.get('d',-1)
    for key in d:
    for value in d.values():
    for k,v in d.items():
    
    • 词典,存储键值对的集合;d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
    • 检测Key是否存在: 'Bob' in d (判断为true 或 false) 或者 d.get('Bob',-1) 不存在时返回-1
    • d.pop(key)方法删除相应的值
    • key只能是不可变的对象

    set集合

    s = set(list(range(1,5)))
    s.add(5)
    s.remove(5)
    st = set([3,4,5,6])
    s & st
    s | st
    
    • 不含重复元素的集合,只保存key值
    • s = set([a,b,c,d]) 创建时只能用set()方法和一个list
    • s.add(key)s.remove(key)

    高级特性

    切片

    • 对list, tuple, string 进行截取操作
    • num = [1,2,3,4,5,6,7],num[0:6:2]的值等于[1,3,5](从索引0到索引6-1,每2个数取一次)
    • (1,2,3,4,5,6)[0:3]等于(1,2,3)
    • 'tofengz'[0:2]等于'to'

    列表生成式

    • 按格式生成list的快捷方式
    [x*y for x in a for y in b]
    
    • 对变量的操作或运算放在前面,后面用for或者if语句注明前面变量的条件或范围,前例为双重循环

    生成器

    • 将列表生成器的[ ]改为( )之后,就定义了一个list的规则,
    • 并不直接存储列表的值,只是当用next()函数或者for迭代取list的值时,根据规则生成相应的值。
    • 也可以通过函数式定义generator,将函数中输出计算结果的地方改为 yield x 语句,即可将函数改造为生成器,例如:
    def  fun(x):
        n = 0
        while n < x:
            y = x*x
            yield y
        return 'finish'
    
    • 可以通过next()取值或者for x in fun(m) 迭代取值(生成器是可迭代对象),但迭代无法得到return内容,因为不能捕获异常

    可迭代对象

    • 只要是可迭代对象都可以用for in
    for x in 'abcd'
    for x, y in dict.item()
    for y in dict.value()
    

    迭代器

    • 可以迭代的对象称为可迭代对象Iterable ,而可以用next()不断取值的称为迭代器Iterator,
    • list, tuple等是Iterable但不是Iterator,所有生成器是Iterator对象
    • 迭代器Iterator是惰性计算,不能预知长度,可以无限长

    流程控制

    条件判断

    if x > 1 :
    elif x < 0 :
    elif ... :
    else :
    

    循环

    • for x in list['c','b','a']: --依次取出list中的所有元素,注意后面有冒号
    • while xxxx :
    • 可用break和continue
      ps: range(5)可以生成0~4的整数序列,list(range(5)) = [0,1,2,3,4]

    函数

    定义

    def xxx(var):
        …
        return x,y
    

    可以返回多个值(tuple类型)

    x = xxx(a)    #x = (x,y)
    x,y = xxx(a)  #x = x,  y = y
    
    • 表示某一步什么都不做时,用pass语句占位
    • 可以把函数的定义单独放在一个文件里,每次调用前注明 from base import xxx
    • 函数是一种对象,有内置参数fun.name(两个下划线)

    参数

    • 必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
    function(x, y = 2, *z, a, **p)
    
    • x——必选参数
    • y—— 默认参数(未传递数值时设定的一个缺省值)
    • z ——可变参数(接受零个、一个或多个参数,保存为tuple。而当一个list, tuple对象传入时,要在变量名之前加上*,将其视为可变参数)
    • p ——关键词参数(以t = i的格式传入,保存为dict--{'t':'i'}。当一个dict对象传入时,变量名之前加上**会将内容保存到新dict中)
    • a—— 命名关键词参数(在分隔符 ,之后或者可变参数(已经包含一个)之后,传入时必须指明定义时的参数名,如a = 'dd'的格式,直接'dd'报错),来要求输入指定的关键词参数

    高阶函数

    把函数作为参数传入函数

    • map(f,x)
      map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
    • reduce(f(a1,a2),x)
      reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
    • filter(f,x)
      filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True/False决定保留/丢弃该元素
    • sorted(x,f)
      将x序列经过f函数处理后再排序

    返回函数

    • 返回值为函数的函数(函数生成器)
    • 返回的函数并未执行,而是等到调用时才执行
    • 返回的函数可以引用原函数的参数,但不要去引用变化的参数
    f = makef()  #得到返回的函数,但未被调用
    f()
    

    匿名函数

    • 用lambda定义一个函数,不指定函数名;只能有一个语句;可以没有返回值;可以赋给变量
    lambda x:x*x
    
    • 可用于高阶函数的参数

    装饰器

    以函数为参数,对函数进行“装饰”(增加功能)的函数

    import functools
    def decorator(func):
    	@functools.wraps(func)
    	def wrapper(*args,**kw):
            	print('....')
    		...
    		return func(*args,**kw)
    	return wrapper
    
    @decorator
    def afunc():
    	...		#相当于 ——> afunc = decorator(afunc)
    

    如此定义后,afunc指向了新的函数,即wrapper(),以此为函数增加功能

    偏函数

    import functools
    newfunc = funtools.partial(sfunc,args)
    
    • 相当于固定了sfunc()的args参数后生成了简介专用版新函数newfunc()
    • functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
    • 当函数的参数个数太多需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

    模块

    • 在Python中,一个.py文件就称之为一个模块(Module),相同名字的函数和变量完全可以分别存在不同的模块中
    • 为了避免模块名冲突,又引入了按目录来组织模块的方法,称为包(Package),每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。init.py可以是空文件,也可以有Python代码。
    • 可以形成多层目录
    • 模块的格式:
    # !/usr/bin/env python3
    # -*- coding: utf-8 -*-
    '这里写文档注释'
    __author__ = '作者'
    
    import sys
    def test():
    	args = sys.argv     		#该变量获取命令行参数
    	if len(args) == 1:
    		print('hello')
    	elif len(args) == 2:
    		print('hello,%s' %args[1])
    	else:
    		print('too many arguments')
    
    if __name__ == '__main__':		#命令行下运行此模块时才会执行下一句
    	test()						#其他地方导入时不会自动执行
    
    • 模块中正常的函数和变量名是公开的,可以被直接引用,如abc
    • 类似__xxx__这样的也可以被直接引用,但是有特殊用途,自己不要这样命名
    • 类似_xxx , __xxx这样的函数或变量就是非公开的,不应该被直接引用
    • 在实际编程时,模块内函数的主体结构可以定义为public,但是内部逻辑可以封装为private
    • 使用pip工具可以方便的安装第三方模块,如:pip install Pillow

    面向对象编程

    定义类

    (类名一般大写字母开头)

    class Student(object):
    
    	#采用此方法把一些认为必须绑定的属性强制填写进去
        def __init__(self, name, score):
            self.name = name
            self.score = score
        def xxx(self,m):
        	...
    
    #定义的类要实例化之后再使用
    li = Student('lining',98)
    li.xxx(n)
    
    • 有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去。
    • 要定义一个方法,除了第一个参数是self外,其他和普通函数一样。
    • 要调用一个方法,只需要在实例变量上直接调用,除了self不用传递,其他参数正常传入
    • 使用“__xx”定义方式将类中的属性私有化。
      • 防止外部直接访问属性变量
      • 通过类的方法对属性进行操作,可以检查传入的参数

    继承和多态

    • 子类可以继承父类的全部方法
    • 子类中可以覆写父类的方法(原来的方法被覆盖)
    • 任何接受父类为参数的函数或方法,都可以接受其子类作为参数。而在方法内部按照父类的类型进行操作即可。(多态)
    • Python这样的动态语言来说,则不一定需要传入父类或者其子类。只需要保证传入的对象有相应的方法就可以了。(鸭子类型)

    查阅对象信息(在不知道对象是否有此属性时才使用)

    • type(x)----返回对应的Class类型
    • isinstance(x,class)----判断一个对象是否是某种类型
    • dir(x)----查看一个对象的所有属性和方法
    • getattr(obj,'attr')、setattr(obj,'attr',value)、hasattr(obj,'attr')
    • 通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息。
    • 如果要获得一个对象的所有属性和方法,可以使用dir()函数,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态
    • 总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”。

    其它

    • 在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性
    • 给一个实例绑定的方法,对另一个实例是不起作用的,为了给所有实例都绑定方法,可以给class绑定方法。
    • 动态绑定允许我们在程序运行的过程中动态给class加上功能
    • 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性。但仅对当前类实例起作用,对继承的子类是不起作用的。
  • 相关阅读:
    如何:通过对字符串应用 HTML 编码在 Web 应用程序中防止脚本侵入
    ref和out的区别?
    debug版本和release版本的区别?
    Ninject依赖注入——构造函数的注入
    WCF入门简单教程(图文) VS2010版
    WCF学习笔记(一)
    WinRt BottomAppBar
    windows 8.1 MessageDialog
    sqlServer学习2-sql脚本说明
    sqlServer学习1-sql脚本
  • 原文地址:https://www.cnblogs.com/tofengz/p/12492208.html
Copyright © 2020-2023  润新知