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('\t')&readlines().split('\t') 的区别:

    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的作用是将使用和实现进行分离,实现模块化编程.

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

posted @ 2018-06-28 17:24  dengshuo7412  阅读(225)  评论(0编辑  收藏  举报