chaoz的杂货铺

生命有息、学无止境、折腾不止

0%

python查缺补漏

使用技巧

linux 下配置快捷启动方式

1
2
3
4
5
vim ~/.bashrc

alias pycharm="bash /home/bobby/Downloads/pycharm-2016.3.2/bin/pycharm.sh"

source ~/.bashrc

加快 pip 安装速度

pip3 install -i https://pypi.douban.com/simple django

安装包出现报错解决方法

https://www.lfd.uci.edu/~gohlke/pythonlibs/

加速 npm 镜像

淘宝镜像

2019.4.12

new、init

在 Python 3 的类中,new 负责对象的创建,而 init 负责对象的初始化;new 是一个类方法,而 init 是一个对象方法。

new 是我们通过类名进行实例化对象时自动调用的,init 是在每一次实例化对象之后调用的,new 方法创建一个实例之后返回这个实例对象,并将其传递给 init 方法的 self 参数。

深入理解Python中的 _ new _ 和 _ init _

##3 metaclass()

内置函数 type() 和 isinstance()

  • type()

(1)查看一个变量(对象)的类型;
(2)创建一个类(class)

2019.6.4

jquery

jQuery 是一个 JavaScript 库。

jQuery 极大地简化了 JavaScript 编程。

要爬取静态网页的html代码,可以使用 jquery去模仿写html。

Ajax

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。

AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。

菜鸟教程

Python enumerate() 函数

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

语法
以下是 enumerate() 方法的语法:

enumerate(sequence, [start=0])

参数

1
2
sequence -- 一个序列、迭代器或其他支持迭代对象。
start -- 下标起始位置。

返回值

返回 enumerate(枚举) 对象。

Headless无头浏览器

无头浏览器即headless browser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面而已。

Headless Chrome

截止目前最新的Chrome版本在Mac\Linux\Windows上都可以使用headless模式

调用方式:

1
2
3
4
5
6
7
a、使用命令行进行调用

首先需要把chrome的安装路径添加到系统路径下面,调用方式如下

chrome --headless http://www.baidu.com

b、通过selenuim进行调用(目前java\python等主流语言都支持selenuim)

Headless Firefox

截止目前最新的Chrome版本在Mac\Linux\Windows上都可以使用headless模式

调用方式:

1
2
3
a、使用命令行进行调用
firefox -headless http://www.baidu.com
b、通过selenuim进行调用

PhantomJS

调用方式:

1
2
3
4
5
6
a、使用命令行进行调用首先在官方网站下载最新的phantomJS版本,并把安装目录的路径添加到系统路径下,然后在命令行打开,使用命令 phantomJS  xx.js url 运行JS脚本。PhantomJS脚本参考:

b、在nodejs中使用phantomjs,需要用到phantomjs中的一个Child Process模块,介绍在这里http://phantomjs.org/api/child_process/。github已经有对
phantomjs的node支持库,项目地址在这里https://github.com/amir20/phantomjs-node

c、通过selenuim进行调用(目前已经不支持了)

列出 Python 中可变数据类型和不可变数据类型,并简述原理

不可变数据类型:数值型、字符串型 string 和元组 tuple。

不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象(一个地址),如下图用 id() 方法可以打印对象的id。

可变数据类型:列表 list 和字典 dict。

允许变量的值发生变化,即如果对变量进行 append、+= 等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。

常用的几种运算:

算述运算:+、-、、/、%、**、//
比较运算:==、!=、<>、>、<、>=、<=
赋值运算:=、+=、-=、
=、/=、%=、**=
逻辑运算:and、or、not
位运算:与、或、异或、取反、左移、右移
成员运算符:in、not in
身份运算: is、is not

  • / 和 // 的区别,/ 是除以结果有小数位,// 整除(向下取整)结果是整数
  • 符号表示取幂,ab 返回 a 的 b 次方
  • is 和 == 的区别
    Python 中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和 value(值)。

== 是 Python 标准操作符中的比较操作符,用来比较判断两个对象的 value(值)是否相等。

is 也被叫做同一性运算符,这个运算符比较判断的是对象间的唯一身份标识,也就是 id 是否相同。

只有数值型和字符串型的情况下,a is b 才为 True,当 a 和 b 是 tuple、list、dict 或 set 型时,a is b 为 False。

怎么样才能让 if 和 else 中的语句都执行

会编程的人都知道,if-else 语句是相斥执行的,如果满足了 if 中的条件,就不能执行 else 中的内容;如果执行了 else 中的内容,一定不会满足 if 条件,所以 if 和 else 是不会同时执行的。

语句 pid=os.fork(),会为当前进程产生一个子进程并返回两个值,为父进程返回子进程的进程 ID,为子进程返回 0。

把 if 条件设定为 fork 方法返回的值是否为 0,如果设置为等于 0,那么就会出现主程序不满足 if 条件,执行 else 中代码块,子进程满足 if 条件,执行 if 中代码块的情况,这样 if 和 else 中的代码块就都会执行。

通过下面这个小案例证明上述描述:

1
2
3
4
5
6
7
8
9
10
11

import os
pid = os.fork()
print(pid)
if pid == 0:
# os.getid()获取当前进程ID
print(os.getpid())
print('hello')
else:
print(os.getpid())
print('goodbye')

注意:os.fork() 方法只在 Linux、Mac、Unix 系统中才能使用。

递归与循环的区别

递归与循环是两种不同的解决问题的典型思路。

递归算法:

优点:代码简洁、清晰,并且容易验证正确性。(如果你真地理解了算法的话,否则你更晕)
缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。

循环算法:

优点:速度快,结构简单。
缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。

参数分类

必备参数: 必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
默认参数: 调用函数时,默认参数的值如果没有传入,则被认为是默认值。
不定长参数: 你可能需要一个函数能处理比当初声明时更多的参数。

可变和不可变对象当参数

不可变对象:字符、数值、无组均为不可变对象,该类型的变量创建后不能修改,修改相当于重新生成一个新的变量。

可变对象:列表、字典为可变对象,该类型的变量创建后可以修改,只是对其内部的元素值更改,变量还是那个变量。

匿名函数

Lambda 来创建匿名函数 Lambda 只是一个表达式,函数体比def简单很多。Lambda 的主体是一个表达式,而不是一个代码块,仅仅能在 Lambda 表达式中封装有限的逻辑进去。Lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。

1
2
3
4
5
6
7
8
9

函数格式:

函数名 = Lambda 变量:表达式
举例:
func = lambda a, b: print(a) if a>b else print(b)
func(10, 3)
输出:
10

对缺省参数的理解?

缺省参数指的是在调用函数的时候没有传入参数的情况下,调用默认的参数,在调用函数的并且赋值时,所传入的参数会替代默认参数。

  • *args 是不定长参数,可以表示输入参数是不确定的,可以是任意多个。例如:参数为列表类型 list 时可以用该值表示。

  • **kwargs 是关键字参数,赋值的时候是以键 = 值的方式参数是可以任意多对,在定义函数的时候不确定有多少参数会传入,就可以使用这两个参数。例如:参数为字典类型 dict 时可以用该值表示。

map 函数和 reduce 函数?

  • 从参数方面讲:
    map() 包含两个参数,第一个参数是一个函数,第二个是序列(列表或元祖,可迭代对象)。其中,函数(即 map 的第一个参数)可以接受一个或者多个参数。
    reduce() 第一个参数是函数,第二个是序列(列表或元祖),但是,其函数必须接受两个参数。

  • 从对传进去的数值作用来讲:
    map() 是将传入的函数依次作用到序列的每个元素,每个元素都是独自被函数“作用”一次。
    reduce() 是将传入的函数作用在序列的第一个元素得到结果后,把这个结果继续与下一个元素作用(累积计算)。

回调函数,如何通信的?

回调函数是把函数的指针(地址)作为参数传递给另一个参数,将整个参数当做一个对象,赋值给调用的函数。

hasattr( )、getattr( )、setattr( ) 函数使用详解?

  • hasattr(object,name) 函数:
    判断一个对象里面是否有 name 属性或者 name 方法,返回 bool 值
    注意:name 要用引号括起来

  • getattr(object,name[,default]) 函数:
    获取对象 object 的属性或者方法,如果存在打印出来,不存在打印默认值,默认值可选。注意:如果返回的是对象的方法,则打印的结果是:方法的内存地址,如果需要运行这个方法,可以在后面添加 ()。

  • setattr(object,name,values) 函数:
    给对象的属性赋值,若属性不存在,先创建再赋值。

网络编程

sk.recv(bufsize[,flag]):接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。

sk.recvfrom(bufsize[.flag]):与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。

sk.getsockname():返回套接字自己的地址。通常是一个元组(ipaddr,port)

sk.connect(address):连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。

sk.listen(backlog):开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。

虚数与实数

1 虚数不能单独存在,它们总是和一个值为 0.0 的实数部分一起来构成一个复数。
2复数由实数部分和虚数部分构成
3表示虚数的语法: real+imagj
4 实数部分和虚数部分都是浮点数
5 虚数部分必须有后缀 j 或 J

Python yield 使用浅析

带有 yield 的函数在 Python 中被称之为 generator(生成器)
参考资料

python 内置函数

Python内置函数详解

Python的闭包函数

什么是主从同步

HDFS

HBase

Xpath 与正则

管道

应用实例:

twisted 框架 与python 框架

爬虫框架有哪些

python中的多进程与多线程

selenium + phantomjs

python分批读取数据

新式类、经典类区别

设计模式

单例模式

python 中的可变类型与不可变类型

类方法、类实例方法、静态方法

python 的内存管理、内存调优手段、内存泄漏处理

装饰器与重载

生成器与迭代器

值传递、引用传递

缺省参数

回调参数

hasattr() gatattr() setattr()

闭包

yield、generator、iterator

喜欢这篇文章?打赏一下作者吧!

欢迎关注我的其它发布渠道