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 |
- leetcode 中的问题,完美利用enumerate 解决:strStr 处理文本字符串的问题
高级特性/列表生成器
- 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]])
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的作用是将使用和实现进行分离,实现模块化编程. -
对象:
对象是能够承载数据类型的值的实体.具有三大重要特性:状态,标识和行为.