Jamal的博客

Jamal的博客


  • 首页

  • 分类

  • 归档

  • 标签
Jamal的博客

Django-model和view拆分为多个文件

发表于 2017-03-19 | 分类于 Django

在标准的dgango项目中,自动生成的目录结构会包括models.py和views.py两个文件,分别在里面写model的代码和controller的代码,但是所有的代码都写在一个文件里面在大项目中不好维护,因此需要拆分开来写。

阅读全文 »
Jamal的博客

Python-@classmethod和@staticmethod的区别

发表于 2017-03-18 | 分类于 Python

基础概念

这个问题的原文答案在:http://pythoncentral.io/difference-between-staticmethod-and-classmethod-in-python/
一个类中的方法最常用的是实例方法,即以self为第一个参数的方法,如下代码所示:

阅读全文 »
Jamal的博客

Python-迭代器

发表于 2017-03-16 | 分类于 Python

首先看一下这个文档:文档链接
从文档中有几个重要的信息:

  • 可迭代对象(Iterable):可以直接作用于for循环的对象,实现了iter()方法。
  • 迭代器(Iterator):可以被next()函数调用并不断返回下一个值的对象。
  • 生成器都是Iterator对象,但集合数据类型虽然是Iterable,却不是Iterator
  • 可以使用iter()把Iterable变成Iterator

iter()函数

iter()的定义:

1
2
3
4
5
6
7
8
9
10
def iter(source, sentinel=None): # known special case of iter
"""
iter(iterable) -> iterator
iter(callable, sentinel) -> iterator
Get an iterator from an object. In the first form, the argument must
supply its own iterator, or be a sequence.
In the second form, the callable is called until it returns the sentinel.
"""
pass
  1. iter(iterable)
    函数参数必须是可迭代对象,支持迭代器协议(iteration protocol)或者是序列协议(sequence protocol)。也就是实现了iter()方法或者getitem()方法,如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Iter1:
'''只有一个参数的情况'''
def __init__(self):
self.count = 0
def __iter__(self):
print('__iter__ is called')
self.count += 1
if self.count > 5:
raise StopIteration
return iter(self)
if __name__ == '__main__':
iter1 = Iter1()
for i in iter1: # 当执行for循环时,实际上是调用了iter1.__iter__(),也就是__iter__(iter1),返回一个iterator对象
print(i)
iter2 = Iter1()
iter22 = iter(iter2)
print(iter22.__next__())
  1. iter(callable, sentinel)
    当有两个参数的时候,则第一个参数必须是可调用的对象(实例)即定义了call方法,这时候iter会生成一个迭代器(Iterator),每次调用这个迭代器的next()方法(在python2中是next()方法),都会调用callable,如果next()方法返回等于sentinel,则抛出StopIteration报错,否则返回下一个值。如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Iter2:
'''两个参数的情况'''
def __init__(self):
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
if self.count > 5:
raise StopIteration()
return self.count
def get_next(self):
self.count += 1
if self.count > 10:
raise StopIteration()
return self.count
if __name__ == '__main__':
iter3 = Iter2()
iter33 = iter(iter3, 10)
for i in iter33:
print(i)
iter4 = Iter2()
iter44 = iter(iter4.get_next, 10)
for i in iter44:
print(i)
Jamal的博客

Python-迭代

发表于 2017-03-16 | 分类于 Python

给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,我们称为迭代(iteration)。
在python中,迭代是通过for…in…来实现的,在java和c中是通过下标来完成的,从这个角度来说,python是一种更加高级的抽象。

阅读全文 »
Jamal的博客

Python-生成器

发表于 2017-03-16 | 分类于 Python

通过List Comprehensions,我们可以很方便的生成一个列表,但是受限于内存等原因,列表的长度是有限制的,例如我们创建一个100w长度的列表,既浪费了空间,又如果我们只需要部分数据的话,那么大部分空间就被浪费了。
所以,如果列表中的元素可以按照某种固定的算法推导出来,我们就可以在迭代中不断地通过这个算法计算出后面的值,这在python中叫做生成器(generator)。

阅读全文 »
Jamal的博客

利用window.performance.timing检测页面加载速度

发表于 2017-02-28 | 分类于 Http

这里写图片描述

阅读全文 »
Jamal的博客

Linux-文件读写

发表于 2017-02-10 | 分类于 Linux
  1. 文件读写原子性:所有的系统调用都是以原子操作方式执行的,内核保证了某系统调用中的所有步骤会作为独立操作而一次性加以执行,期间不会被其他进程或线程所中断。
    阅读全文 »
Jamal的博客

cmake使用

发表于 2017-02-08 | 分类于 C

CMake是一个跨平台的程序构建工具,比如起自己编写Makefile方便很多。

本文件不介绍CMake的基本语法,下面是篇不错的入门教程:
http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/

阅读全文 »
Jamal的博客

ssh远程登录忽略“know hosts”检验

发表于 2017-02-08 | 分类于 Linux

我们在生产环境一般会配置一台跳板机,可以免密登录线上所有的机器,但是默认在登录的时候配置了ssh key之后还会要求输入“yes”然后登录,这种非常不方便,我们可以改一下跳板机的配置文件,忽略这个步骤:

阅读全文 »
Jamal的博客

spring自定义注解实现简单权限管控

发表于 2017-02-07 | 分类于 Spring

有时候我们需要在提交请求的时候验证某个用户是否具有某些权限,这些有security等框架可以帮我们做掉,但是有时候只需要简单的权限验证,不需要这么强大的框架帮助,因此就可以借助自定义注解实现一些简单的权限验证功能。

阅读全文 »
1…4567
jamal-jiang

jamal-jiang

程序员,技术,生活

62 日志
19 分类
40 标签
© 2018 jamal-jiang
由 Hexo 强力驱动
主题 - NexT.Pisces