文档章节

python 难点总结

HuangJC
 HuangJC
发布于 2017/05/17 10:14
字数 1733
阅读 43
收藏 0

1.回归函数

上述是廖雪峰教程中的代码。

先分析一下代码:

一个count()返回一个list,list里面的元素是3个函数。由于参数J是根据循环i(可变参数)而定,而参数的分配往往是等返回全部函数才返回参数。因此只会得到9,9,9.而上面增加了多一个def f(j)用于在每次循环都实时返回参数,所以才得到1,4,9

之前一直困惑,能不能不要def g()和return g,直接用def f(j),然后内容就直接return j×j。这样也实时返回了i。

显然是不行的,而且def f(j)这个多一层的返回函数是不能忽略。有上面的困惑最主要是我忽略了在return 中   return f return f()的差别。return f是返回函数,而return f()是直接执行函数。

也就是说执行count()后,是这样的list【g(j),g(j),g(j)】而不是我想的【f(j),f(j),f(j)】,因此要么fs.append()括号中填f而不是f(),要么就像上面增加一个返回函数f。还有网有的大神方法,如下

2.装饰器

廖雪峰装饰器作业:

答案:

import functools

def log(pointer):  #pointer是个变量,在这里能指向函数或者str,这就要看if条件
	if not isinstance(pointer,str):  #如果pointer不是字符串,pointer指向函数func,
		@functools.wraps(pointer)
		def wrapper(*args,**kw):
			print 'begin %s,test:none' % pointer.__name__
			return pointer(*args,**kw)
		return wrapper
	else:#不然的话,pointer指向str
		def decorator(func):
			@functools.wraps(func)
			def wrapper(*args,**kw):
				print 'begin %s,test:%s' % (func.__name__,pointer)
				return func(*args,**kw)
			return wrapper
		return decorator

3.元类metaclass

对象-关系映射表

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#对象-关系映射表 ,先声明一下: u=user(~)
class Field(object):
	def __init__(self, name,column_type): #字段名,字段类型
		self.name = name
		self.column_type = column_type
	def __str__(self):
		#如果直接print Field,返回类的名字(这里是Field)和字段名
		return '%s:%s' %(self.__class__.__name__,self.name)

#用于定义
class StringField(Field):
	def __init__(self,name):    #super让本子类继承了两属性,name和column_type
		super(StringField,self).__init__(name,'varchar(100)')

class IntegerField(Field):
	def __init__(self,name):
		super(IntegerField,self).__init__(name,'varchar(100)')


class ModelMetaclass(type):  #创建类都需要从type中派生
	#cls是元类对象ModelMetaclass,name是类名,bases是类继承的父类集合(dict),
	# attrs是类的方法集合(就是ID,email那个,82行附近,暂时不了解为啥会等于attrs)
	def __new__(cls,name,bases,attrs):
		#如果类名是'Model',就直接返回一个类
		if name == 'Model':   #在本例中,先由name为model创立model类,然后再由名为user创立一个user类,看46行
			return type.__new__(cls,name,bases,attrs)
		#创建一个dict
		mappings = dict() 
		#抽取attrs中的集合
		for k,v in attrs.iteritems():
			#判断获取的value是否是Field类型,(Value通常是Field的子类)
			if isinstance(v,Field):
				# 打印指向实例的变量,实例信息
				print ('Found mapping: %s==%s' %(k,v))
				#如果value是FIeld类型,将该key和value放进mappings的dict中
				mappings[k] = v
		for k in mappings.iterkeys():
			#删除attrs里面被放进mappings中相同的key,对应的value也会被删除
			attrs.pop(k)
		attrs['__table__'] = name
		#python允许在dict中放入一个dict
		attrs['__mappings__'] = mappings 
		
		return type.__new__(cls,name,bases,attrs) 

class Model(dict):
	#以ModelMetaclass的__new__来创建MOdel这个类
	__metaclass__ = ModelMetaclass

	def __init__(self,**kw):     #self是一个dict,由于user继承model,model继承dict,所以在生成实例时user(参数)括号里参数是传入类似与**kw的参数,参数会自动转化成dict.
		super(Model,self).__init__(**kw)

	def __getattr__(self,key):
		#比如尝试返回u[age],没有则报错
		try:
			return self[key]
		except KeyError:
			raise AttributeError(r"'Model' object has no attribute '%s'" % key)
	
	#允许u[key] = value 赋值
	def __setattr__(self,key,value):
		self[key] =value

	def save(self):
		fields = []
		params = []
		args = []
		for k,v in self.__mappings__.iteritems(): #__mappings__存储的是84行dict
			fields.append(v.name)  #v.name是各实例中name属性的值
			params.append('?')
			args.append(getattr(self,k,None))  #k是指向实例的变量名,根据__getattr__函数返回的是
		sql = 'insert into %s (%s) values (%s)' %(self.__table__,','.join(fields),','.join(params))
		print('SQL:%s' % sql)
		print('ARGS:%s' % str(args))


class User(Model):
	# 定义类的属性到列的映射:

	# 创造了类似于这样一个dict
	# {ID:<__main.StringField object at 0x017AD830>,name:(基于StringField的实例),email:(~实例),password:(~实例)}
	# 这个dict就是等等在__new__中代入的attrs
	id = IntegerField('uid')
	name = StringField('username')
	email = StringField('email')
	password = StringField('password')

# 创建一个实例:
u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd')
# 保存到数据库:
u.save()

#输出结果如下
# Found model: User
# Found mapping: email ==> <StringField:email>
# Found mapping: password ==> <StringField:password>
# Found mapping: ID ==> <IntegerField:uid>
# Found mapping: name ==> <StringField:username>
# SQL: insert into User (password,email,username,uid) values (?,?,?,?)
# ARGS: ['my-pwd', 'test@orm.org', 'Michael', 12345]

上述代码大概思路是:

①在创建user类时,就包含了在user下的所有属性(但不包括括号里面的,比如id = 12345),就是那个id=IntegerField('uid')那4个。

②由于user类继承了model类,而model中又有__metaclass__=modemetaclass类,所以会先用modemetaclass类中的__new__()方法创建model函数,然后user在通过modemetaclass中的__new__()方法创建user函数,同时继承拥有model所有的方法和属性.

③在modemetaclass类中的__new__的大概意思是:attrs是一个字典,里面包含了4个key和value,也就是id=IntegerField('uid')那4个,id是key,=号后面的是value.判断字典中的所有值value是否继承Field类,满足的话,将那个value和对应的key都放进__mappings__这个字典中(__mappings__是新创建的dict).然后将__mappings__字典保存在attrs字典中(也即是字典中的字典),并创建一个新key(__table__)表名和值放在attrs中,同时清空attrs中有的,但__mappings中也有的相同key和值,清的是attrs中的.这是attrs只有两个key,也就是__mappings__和__table__

④上面都是创造类的,就是不会运行如下面括号中的内容,比如(id=12345,,,,)

# 创建一个实例:
u = User(id=12345, name='Michael', email='test@orm.org', password='my-pwd')

现在创建实例,就要用到括号中的参数.

虽然在创建实例和创建类时,都用了相同的属性,比如id,创建类是指向一个实例IntegerField('uid')用于判断其是否继承Field类,创建实例是id是指向一个整型12345.

由于继承dict类,所以创造实例后,变量u指向的实例实际上是一个字典.该字典就是{'id':12345,'name':'Michael'....}那4个.

4.搜索所以子目录包含有‘t’的文件

import os

def search(s,dir=os.path.abspath('.')):
    for x in os.listdir(dir):   #通过循环列出当前目录的文件及文件夹列表
        newpath=os.path.join(dir,x)  #对列表中的文件及文件夹都添加路径
        if os.path.isfile(newpath) and (s in os.path.splitext(x)[0]):  #判断是否是文件并且文件名中是否包含test字符
            print newpath  #打印路径
        if os.path.isdir(newpath):  #判断是否文件夹
            search(s,newpath)  #递归search,第二级search和第一级search中的属性互补影响

if __name__ == '__main__':
	search('test')

 

© 著作权归作者所有

共有 人打赏支持
HuangJC
粉丝 0
博文 32
码字总数 39927
作品 0
佛山
私信 提问
编程直播室第三期:实战Django网站开发

说实话我Python用的时间不长,Django也只是才接触,我在GitChat分享《Python抓取制作电子书》时,有人问我:不会Python能不能学? 这让我想起一个故事:里面的女主人公想和恋人羞羞,但是不得...

孙亖
06/30
0
0
python学习心得之资源对比

由于我报了阿里云的人工智能专业课程,所以python不得不学。 之前看阿里云课程里的python教学视频,看了两节,讲得虽然易懂,但是过于啰嗦,而且呢视频比文字学起来肯定要慢。 因为我喜欢比较...

天道99
07/01
0
0
大数据学习实践总结(2)--环境搭建,JAVA引导,HADOOP搭建

PS:后续的文章会把我实践的内容分解成为一个个的小模块,方便大家的学习,交流。文未我也会附上相关的代码。一起加油! 学有三年的大数据原理,一直没有实践过。最近准备离职,正好把自己所学...

bingyang87628
06/26
0
0
Python第二章包入门实战-张明阳-专题视频课程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a2011480169/article/details/83579572 Python第二章包入门实战—496人已学习 课程介绍 本次视频重点介绍了P...

安静的技术控
02/11
0
0
一篇Python函数最佳总结,即简短又实用,带你彻底摸清函数!

函数是什么? 函数一词来源于数学,但Python编程中的「函数」概念,与数学中的函数是有很大不同的。编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在P...

Python新世界
07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java Timer理解

Java Timer实现功能、原理分析 功能 指定时间执行任务 周期性执行任务 延时周期性执行任务 固定频率执行任务 涉及到的类 主要类 java.util.Timer 初始化定时任务存放队列; 初始化定时调度线...

666B
8分钟前
0
0
Apache Tomcat 8.5 安全配置与高并发优化

通常我们在生产环境中,Tomcat的默认配置显然不能满足我们的产品需求,所以很多时候都需要对Tomcat的配置进行调优,以下综合我自己的经验来配置 Tomcat 安全与优化情况,如果你有更好的方案,...

Airship
8分钟前
0
0
ThreadPoolExecutor源码解析(二)

1.ThreadPoolExcuter运行实例   首先我们先看如何新建一个ThreadPoolExecutor去运行线程。然后深入到源码中去看ThreadPoolExecutor里面使如何运作的。 public class Test { public sta...

终日而思一
15分钟前
0
0
JavaScript创建对象方法实例小结

本文实例讲述了JavaScript创建对象方法。分享给大家供大家参考,具体如下: 最简单的方式就是创建一个Object对象,并为其添加属性和方法。 //示例代码var person=new Object()person.name=...

peakedness丶
32分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部