• Python基础知识点


    Python相关

    基础知识点

    数据结构

    • List列表
    • Set集合
    • Dict字典
    • Tuple 元组

    0x01.列表

          列表[] square brackets,是一系列按照特定顺序排列的元素组成,元素之间可以没有任何关系,元素类型也可以不同
          python列表的特殊语法,除了可以正常的按照顺序访问,**-1可以访问列表中最后一个元素**
          <font color=read>sort()对列表进行永久排序,sorted()对列表进行临时排序</font>
          range()可以用来创建数值列表,可以高效的存储并处理数字
    

    0x02.元组

          列表适合保存运行时会发生变化的数据集;不可变的列表成为元组() pair of parentheses
          修改元组的元素会报TypeError
    

    0x03.字典

          字典{} ,是一系列键值对,每个键都与一个值相关联
          字典中可以之间添加键值对,使用del 来删除键值对
           items()函数返回键-值对列表,keys()返回所有的键列表,values()返回所有值的列表
          遍历字典  for key, value in dict.items()   
    

    0x04.集合

          集合类似于列表,但是每个元素都是独一无二的,可以用来快速筛选重复元素
    

    python的优势

    • Python中的for循环要高于C语言中的for循环,因为Python中的for循环不仅可以用在list或tuple上还可以用在其他的可迭代对象上.

    python enumerate() 函数

    • 这算是一个循环技巧(loop techniques):在字典循环中,关键字和对应的值可以使用iteritems()方法同时解读出来
    for i,v in dict.iteritems():
        print i,v
    
    • python 实现下标循环,利用Python内置的enumerate函数可以把一个list变成索引-元素对.这样就可以在for循环中同时迭代索引和元素本身.
    • 对于序列循环中,索引位置和对应值可以使用enumerate()函数同时得到 (index,value).不过三层以上的循环就很少用了
    for i ,v in enumerate({['a','b','c']):
         print i,v
    

    输出:

    i v
    0 a
    1 b
    2 c

    高级特性/列表生成器

    • generator 一个生成器,区分和list的区别
      是一个可以迭代的对象 
    g=(x*x for x in range(10)) for n in g: print(n)
    
    • list 的元素可以直接打印,Generator 的元素 可以用for循环来进行实现
    • 可迭代对象 Iterable ,这是可以直接作用于for 循环的对象。
    • 迭代器   Iterator ,这是不断返回下一个值的对象称为迭代器,可以被next()函数调用

    在linux的python开发中

    • 利用ctrl+z 是将程序挂起
    • jobs 显示所有命令 
    • fg 还原挂起的进程
    • bg 后台运行

    高阶函数

    • 绝对值函数 abs() ,分清楚函数调用和函数本身的区别 abs就是函数本身
    • 如果将系统内部的函数名定义为变量,例如abs=10,那么想恢复 abs函数需要重新启动python交互环境
    • 高阶函数:一个函数可以接受另一个函数作为对象,这种函数就叫高阶函数
      内建函数:
    • map() and reduce() 非常重要的函数 .map():map(函数,Iterable)
      """list 对象不能调用  list object is not callable"""
    • reduce() 函数,是将结果继续和序列的下一个元素做累积计算。
    • lilter() 函数,用于过滤序列,sorted([],key=,reverse=Ture) 排序函数
    • 多线程,多进程之间的区别,如何实现多进程和多线程
      append() VS extend():
       
    • list.append() 是向列表中添加一个对象 object,也就是整体打包加入
    • list.extend() 是把一个序列的内容添加到列表
    • 在控制台重新加载文件时需要调库
    from importlib import reload
    

    python console

    加载reload() 函数,可以重新调用

    • syntax errors and exceptions
      Exceptions:(异常)
    • 即使在程序语法完全正确的情况下,执行的时候也有可能发生错误,在程序运行时检测出的错误称之为异常!!!handling exceptions 控制异常可以编写程序来控制已知的异常.
          while True:
                         try:
                             x=a+b 
                             break
                         except ValueError:
                             print("it's a value error")
    

    在Python算法中,实现数组的旋转,可以利用下标的加数进行取余来进行数组元素交换
    具体看 rotate.py文件
      Python cookbook
    对齐文本字符串基本的有ljust(),rjust(),and center()还有利用format()函数,format(text,'>20'),format(text,'*^20s') #对齐字符">.^"老代码中还可以看见利用% 的操作符,format()函数要好用很多.
    以后的研究用到矩阵后者向量,Numpy 是一个很好的起点 numpy.org :

    • random.choice(values) # 随机选择一个
    • random.sample(values,n) #随机选择n个元素
    • random.shuffle(values) # 原地打乱顺序,也叫重新洗牌

    if name_=='main' && read 函数

    • 简单的理解:
      如果模块是被直接运行(run)的,则代码块被运行
      如果模块是被导入(import)的,则代码块不被运行  
    • python -m 参数用于将一个模块或者包作为一个脚本运行 ,还是没有搞透
    • readline() &readlines()的区别:

      readline() 每次读取一行,返回这一行的元素,结合for语句进行使用.

      readlines() 读取所有的行,并将这些行全部保存在一个list 中 return a list,但是这个方法不适合读取较大的文件,太占内存
    • readline().split(' ')&readlines().split(' ') 的区别:

      readline() 每次读出一行内容,读取所占的内存资源小,适合大文件的读取,返回一个字符串对象(str)

      readlines() 读取整个文件所有行,保存在一个list 当中,每行作为一个元素,读取大文件可能会比较占内存

    python的 _init_ ()的使用方法及定义
    这个方法一般用于初始化一个类:

    • 1.首先说一下,带有两个下划线开头的函数是声明该属性为私有,不能在类地外部被使用或直接访问。
    • 2.init函数(方法)支持带参数的类的初始化 ,也可为声明该类的属性
    • 3.init函数(方法)的第一个参数必须是 self(self为习惯用法,也可以用别的名字),后续参数则可 以自由指定,和定义函数没有任何区别。

    Python 网络爬虫(crawl)

    • 对于爬取网络的界面分析,可以使用:
      builtwith 来进行爬取网页的的框架几语言分析 import builtwith
    • 对于一些需要联系网页的所有者,可使用
      WHOIS协议  import whois 找到所有者及其邮箱
    • URL,(uniform resource locator)统一资源定位符
    • URI (universal resource identifier) 通用资源标志符
    • 爬取需要登陆的网站,如果不是从浏览器 发出请求,则得不到响应。我们需要将爬虫程序伪装成正规军
       实现办法:自定义网页请求报头
      requests库  比较重要的一个网页处理库
            requests.request() 这是一个基础支撑,构造一个网页向服务器的请求
            requests.get()       获取HTML网主要办法
            requests.head()      获取网页头文件
            requests.post()      提交post请求,对应Http的post
            requests.put() 提交一个put的请求
            requests.patch() 提交局部修改请求
            requests.delete() 向网页提交删除请求
            
      html知识:父节点、子节点、孙节点  <div和/div>成对出现,并限定了标签的开始和结束的位置。

    位置参数&关键字参数

    • 位置参数:调用函数时根据函数定义的参数位置来传递参数
      注意,就是两个参数的顺序必须一一对应,且少一个参数都不可以
    • 关键字参数:用于函数调用,通过 键-值 (也就是字典变量) 形式加以确定
      可以让函数更加清晰,容易使用,同时也清除了参数的顺序需求
    • 位置参数必须在关键字参数的前面.但关键字参数之间不存在顺序.
    # 位置参数
    def print_hello(name,sex):
    # 在进行调用时,参数顺序要求一致
    print_hello('dengshuo', male)
    
    # 关键字参数
    # 在调用时
    print_hello(name='dengshuo',sex='male')
    
    # 可以接受任意数量的位置参数的函数
    def avg(first,*rest):  
    # 利用*可以表示任意数量的位置参数
    
    # 接受任意数量的关键字参数
    def avg(*args,**kwargs):
    

    所有的位置参数都会在元组args中,
    所有的关键字参数都会放置在字典kwargs中

    tile() 函数

    - tile(A,reps):
    # construct an array by repeating A the number of times given 
    # by reps 
    

    returns : ndarray ,the tiled output array
    Examples:

    a = np.array([0, 1, 2])
    np.tile(a, 2)
    array([0, 1, 2, 0, 1, 2])
    np.tile(a, (2, 2))
    array([[0, 1, 2, 0, 1, 2],
    [0, 1, 2, 0, 1, 2]])
    np.tile(a, (2, 1, 2))
    array([[[0, 1, 2, 0, 1, 2]],
    [[0, 1, 2, 0, 1, 2]]])

    b = np.array([[1, 2], [3, 4]])
    np.tile(b, 2)
    array([[1, 2, 1, 2],
    [3, 4, 3, 4]])
    np.tile(b, (2, 1))
    array([[1, 2],
    [3, 4],
    [1, 2],
    [3, 4]])

    c = np.array([1,2,3,4])
    np.tile(c,(4,1))
    array([[1, 2, 3, 4],
    [1, 2, 3, 4],
    [1, 2, 3, 4],
    [1, 2, 3, 4]])

    • 多维数组的求和 numpy.sum()函数
    import numpy as np
    a = np.array([[0, 2, 1]]) # 二维数组
    print a.sum()
    print a.sum(axis=0)
    print a.sum(axis=1)
    
    结果分别是:3, [0 1 2], [3]
    b = np.array([0, 2, 1])
    print b.sum()
    print b.sum(axis=0)
    print b.sum(axis=1)
    
    结果分别是:3, 3, 运行错误:'axis' entry is out of bounds
    可知:对一维数组,只有第0轴,没有第1轴
    c = np.array([[0, 2, 1], [3, 5, 6], [0, 1, 1]])
    print c.sum()
    print c.sum(axis=0)
    print c.sum(axis=1)
    
    结果分别是:19, [3 8 8], [ 3 14  2]
    

    Python中的随机数

    • 内部函数random. uniform是属于random模块,使用静态方法使用该方法.
       random.uniform(a,b)在区间(a,b)产生一个随机数并返回.
    • 数据分析时的numpy()产生随机数
      numpy.random 模块
      1.简单随机数:产生简单色随机数据,可以是任何维度
      2.排列:将所给对象随机排列
      3.分布:产生指定分布的数据,高斯分布
      4.生成器:种随机数种子,根据同一种子产生的随机数是相同的
      生成器:随机数产生的算法与系统有关,windows,linux 即便是随机种子一样,不同系统产生的随机数也不一样.
      np.random.seed([1234])
      简单随机数:
    np.random.rand(2,3) #产生2行三列均匀分布随机数组
    Out[7]: 
    array([[ 0.35369993,  0.0086019 ,  0.52609906],
           [ 0.31978928,  0.27069309,  0.21930115]])
    
    np.random.randn(3,3) #三行三列正态分布随机数据
    Out[8]: 
    array([[ 2.29864491,  0.52591291, -0.80812825],
           [ 0.37035029, -0.07191693, -0.76625886],
           [-1.264493  ,  1.12006474, -0.45698648]])
    

    关于numpy如何产生随机数的博客

    python中__init__方法理解
    理解:就是Python的构造方法
    构造方法和初始化

    class FooBar:
           def __init__(self):
                  self.somevar = 42
    

    shell: f = FooBar()
    f.somevar
    output:42
    如果没有使用构造方法初始化值,那么就不能直接调用 somevar

    float('inf')

    在python中表示正负无穷.

    x=float('inf')
    y=float('-inf')
    

    当涉及 > 和 < 运算时,
    所有数都比-inf大,所有数都比+inf小

    range and xrange
    (对于python2而言的)对于一个循环来说,range和xrange的差别是比较大的
    range() 和xrange()的用法完全相同,但是range()返回一个数组,xrange()返回一个生成器
    .要生成一个很大的数组时,用xrange()要比range()性能优越很多,不需要一开始就开辟很大的内存空间地址
    python3中的xrange()已经被取消了,range()函数返回的就是一个生成器?

    # 外部包和引用的包自动实现autorelaod
    # 下面代码直接放在语句行里面
    %load_ext autoreload
    %autoreload 2
    

    numpy 中的np.ravel()及np.flatten()

    • 在应用中ravel及flatten都是对np.array()进行操作.结果都是将数组转换成一维数组(向量)
    • 不同之处在于np.ravel()返回的一个视图,修改时会改变原始matrix.np.flatten()返回的是一个拷贝,修改不会改变原来的matrix. 这个np.ravel可以和C++的引用(&别名)的那样理解.

    Pytorch torch包中函数

    • pytorch and torchvision pytorch教程;以及官方文档PyTorch0.4.1
    • x.clamp(min=0) == maximum(0,x) 实现relu函数功能
    • 在torch中可以直接使用backward()来计算反向梯度.利用grad.zero_()可以将梯度进行置零.
      问题就是为什么要将梯度进行置零.

    super()函数实现调用父类(超类)

    • 我们想调用一个父类中的方法,但是这个方法在子类中已经被覆盖,就可以使用super()函数完成.
    • super是一个常见调用父类的__init__()方法,确保父类被正确的初始化了.
    • python cookbook p.259 调用父类的方法

    reduction python tensorflow,pytorch

    • reduce or reduction 约简操作.一种跨维度的张量操作,计算结果比原来张量缩减一个维度.

    实现多维数组
    - python中实现多维列表(数组)很简单,只要使用 append()添加就可以实现

    list=[]
    list=list.append([])
    list[0]
    

    list 就变成一个二维列表,list[0]是就是刚刚添加进来的列表

    list ,dict中找出min,max值及其下标index

    • 对于列表而言:
      max,min 就可以直接返回list的最大最小元素
      返回最大最小值的下标index,需要给index一个声明
    list_test=[1,2,0,4,5]
    min(list_test)      # return 0
    list_test.index(min(list_test))   # return index "2"
    
    • 对于字典而言:
    dict_test={'a':3,'b':4,'c':1}
    min(dict_test,key=dict_test.get) # 返回value最小值所对应的键key    return  :'c'
    min(dict_test)                               # 返回最小的key 键    return :'a'
    
    # 注意可以使用循环,当知道value来寻找key的时候
    

    C/C++相关
    C++中的对象,变量,值

    • 对象和变量一般是可以互换使用,不用区分.
    • 对象(object):指一块能够存储数据并具有某种类型的内存空间.
    • 变量(variance):为了把命名的对象和未命名的对象区分开来,把命名的对象叫做变量
    • 值(value):对象是能够修改的数据,而值是指只读的数据.

    malloc()函数用法
    malloc=memory allocation

    void *malloc(int size);
    

    The function malloc() reserves a block of memory of specified size and return a pointer of type void which can be casted into pointer of any form.

    malloc向系统申请分配size字节的内存空间,返回的类型是不确定类型的指针.

    ptr=(cast-type*)malloc(byte-size);
    
    ptr=(int*)malloc(100*sizeof(int));
    

    返回之前必须经过强制转换,否则出现错误"不能将void赋值给int变量"

    malloc 只管分配内存,并不会进行初始化.其内存空间的值可能是随机的.

    还有一个calloc()函数也可以用于动态分配内存块.这个函数可将内存空间进行初始化.

    ptr=(cast-type*)calloc(n,element-size);
    ptr=(float*)calloc(25,sizeof(float));
    # in the last
    free(ptr);
    

    一个例子

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        int num, i, *ptr, sum = 0;
        printf("Enter number of elements: ");
        scanf("%d", &num);
        ptr = (int*) malloc(num * sizeof(int));  //memory allocated using malloc
        if(ptr == NULL)                     
        {
            printf("Error! memory not allocated.");
            exit(0);
        }
        printf("Enter elements of array: ");
        for(i = 0; i < num; ++i)
        {
            scanf("%d", ptr + i);
            sum += *(ptr + i);
        }
        printf("Sum = %d", sum);
        free(ptr);
        return 0;
    }
    
    

    C的库函数 :sprintf()

    函数的描述:

    int sprintf(char *str ,const char *format,...)
    
    #include <stdio.h>
    #include <math.h>
    
    int main(){
         char str[40];
         sprintf(str,"PI的值=%f", M_PI);
         puts(str);
         return(0);
    }
    

    还有一个很好的例子

    /**
     * Return an array of size *returnSize.
     * Note: The returned array must be malloced, assume caller calls free().
     */
    char** fizzBuzz(int n, int* returnSize) {
        *returnSize = n;
        char buf[11];   //mean  what?
        char** re_p = (char**)malloc(sizeof(char*)*n);
        int i = 0;
        for(i=0;i<n;i++)
        {
            if(((i+1)%3==0)&&((i+1)%5==0))
            {
                sprintf(buf,"%s","FizzBuzz");
            }else if((i+1)%3==0){
                sprintf(buf,"%s","Fizz");
            }else if((i+1)%5==0){
                sprintf(buf,"%s","Buzz");
            }else{
                sprintf(buf,"%d",i+1);
            }
            re_p[i]=malloc(sizeof(buf));
            memcpy(re_p[i],buf,strlen(buf)+1);
            memset(buf,"",11);
        }
    
        return re_p;
    }
    

    for,while,do-while

    • for 循环的循环代码和主题代码同在一个代码段中,递增变量在循环结束后是不可用的
    • while循环,递增变量循环结束后还是可以用的.多使用while的主要原因.
    • do-while 循环,是每次执行完循环体后在底部进行测试,它的循环体至少执行一次.当while表达式为真时继续执行do循环中的语句

    引用&指针

    • 引用即别名
      引用并不是取目标对象,它只是为一个已经存在的对象所起的另外一个名字.
      引用值的改变也会导致被引用值发生相同的变换.
    • 要理解清楚,指针值,指针对象,指向指针的指针
    • 一元运算符 * 是间接(indirection)或者解引用(dereferencing)运算符.用于指针时即访问此指针所指向的对象.
    • 在C/C++中要明确的指出操作的是数据还是指向数据的指针,而在java语言中,指针操作是隐式的,除了原始数字类型之外,操作总是数据的引用(指针)而不是数据本身.

    向vector对象中添加元素

    • 先创建一个空的vector
    • 利用vector的成员函数 push_back 添加元素.push_back负责把一个值当成vector对象的尾元素push压到vector对象的"尾端"back.

    析构函数

    • 析构函数:构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。

    编译程序知识点
    gcc & g++的一些知识点:
    编译阶段,g++会调用gcc,对于c++代码代码来说两者是一样的
    但是gcc不能自动和c++使用库链接,通常使用g++来完成链接
    故统一 编译/链接 直接使用g++

    clang:默认不支持c++11模式
    编译时候加上版本模式:
    g++ -std=c++11 test.cpp

    也可以bash重新命名:
    echo "alias g++='g++ -std=c++11'" >> ~/.bashrc'
    source ~/.bashrc

    Java相关
    整数和字符串之间的转换 int and string

    public class Integer
             static int parseInt(string)
             static string toString(int)
    

    声明 创建 初始化

    这是借鉴java的定义,应该是适用的:

    • 声明数组:指定数组的名称和包含的数据类型  double [] a;
    • 创建数组:指定数组的长度,其元素的个数 a=new double[N];
    • 初始化数组:将数组中的每个元素进行赋值 for(int i=0;i<N;i++) a[i]==0.0;

    递归

    编写递归代码的主要规范思想:

    • 1.递归总要有一个最简单的情况  包含return的条件语句

    • 2.递归调试总是去解决一个规模更小的子问题  就是递归问题一定要收敛

    • 3.递归调用的父问题和解决函数的子问题之间不应该有交集

    程序语言基本结构

    静态方法:封装并重用代码,可以用独立的模块来开发程序

    数据抽象:数据抽象的封装和重用代码,是我们可以定义非原始数据类型,进而支持面对对象编程.

    • ADT 抽象数据类型:
      能够对使用者隐藏数据表示的数据类型

    • API 应用编程接口:
      API的作用是将使用和实现进行分离,实现模块化编程.

    • 对象:
      对象是能够承载数据类型的值的实体.具有三大重要特性:状态,标识和行为.

    不要用狭隘的眼光看待不了解的事物,自己没有涉及到的领域不要急于否定. 每天学习一点,努力过好平凡的生活.
  • 相关阅读:
    Jmeter 调试接口用例怎么判断提取的上一个接口返回值是正确的?
    Jmeter 加密处理方法
    Apache Ignite 学习
    jmeter 中 浮点数计算精度问题
    httprunner 使用总结
    oh-my-zsh 安装及使用
    内置装饰器二:@property
    内置装饰器一:@classmethod、@staticmathod
    python实现列表的排序
    Mac git简易使用
  • 原文地址:https://www.cnblogs.com/GeekDanny/p/9239792.html
Copyright © 2020-2023  润新知