Python进阶

Stella981
• 阅读 645

############python 高阶函数
可以接受函数作为参数的函数
def add(x,y,f):
    return f(x)+f(y)

由于参数想,x,y和f都可以任意传入,如果f传入其他函数,就可以得到不同的返回值

############map()函数
它接收一个函数f和一个list,并通过把函数f依次作用在list的每个元素上,得到一个新的list并返回
由于list包含的元素可以是任何类型,因此,map()也可以处理包含任意类型的list

注意:map()函数不会改变原有的list,而是返回一个新的list

############reduce()函数
reduce()传入的函数f必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果。

###########filter()
filter()函数接收一个函数f和一个list,这个函数f的作用是对每个元素进行判断,返回true和false,
filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件组成的新list

#############自定义排序函数
sorted()也是一个高阶函数,他可以接收一个比较函数来实现自定义排序

#############匿名函数
lambda x:x*x 
关键字lambda表示匿名函数,冒号前面的x表示函数的参数
匿名函数有个限制,就是只能有一个表达式,不能写return,返回值就是该表达式的结果

###############函数作用域的LEGB
L:local函数内部的作用域
E:enclosing函数内部与内嵌函数之间
G:global全局作用域
B:build-in内置作用域

############闭包
内层函数引用了外层函数的变量,然后返回内层函数的情况
###########传入参数
def set_passline(passline):
    def cmp(val):
        if val>=passline:
            print('pass')
        else:
            print('failed')
    return cmp
f_100=set_passline(60)
print(type(f_100))
>>><type 'function'>
print(f_100.__closure__)
>>>(<cell at 0x0000000002B004F8: int object at 0x000000000206DF58>,)
f_100(89)
>>>pass
f_100(59)
>>>failed

###################传入函数
def my_sum(*arg):
    return sum(arg)
def my_average(*arg):
    return sum(arg)/len(arg)

def dec(func):
    def in_dec(*arg):
        if len(arg)==0:
            return 0
        for val in arg:
            if not isinstance(val,int):
                return 0
        return func(*arg)
    return in_dec
my_sum=dec(my_sum)
print(my_sum(1,2,3,4,5))
print(my_sum(1,2,3,4,5,'6'))

#####装饰器(对闭包的使用)
@decorator可以极大的简化代码,避免每个函数编写重复性代码

1.装饰器用来装饰函数
2.返回一个函数对象
3.被装饰函数标识符指向返回的函数对象
4.语法糖@deco
decorator本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数
python提供@语法,这样可以避免手动编写f=decorator(f)

def dec(func):
    def in_dec(*arg):
        if len(arg)==0:
            return 0
        for val in arg:
            if not isinstance(val,int):
                return 0
        return func(*arg)
    return in_dec
@dec 
def my_sum(*arg):
    return sum(arg)
def my_average(*arg):
    return sum(arg)/len(arg)
##my_sum=dec(my_sum)
print(my_sum(1,2,3,4,5))
print(my_sum(1,2,3,4,5,'6'))

###############完善装饰器
@functools
decorator还改变了函数的__doc__等其它属性。如果要让调用者看不出一个函数经过了@decorator的“改造”,就需要把原函数的一些属性复制到新函数

########偏函数
functools.partial可以把一个参数多的函数变成一个参数少的新函数,少的参数需要在创建时指定默认值

####模块和包
包/模块
包就是文件夹,包可以有多级,包下面必须要有__init__.py文件(和单纯文件夹的区别)
模块就是py文件

要使用一个模块,我们就必须先导入该模块,使用import,之后可以访问模块中定义的所有公开的函数,变量,类

如果我们只希望导入用到的math模块的某几个函数,而不是所有函数,from math import pow, sin, log这样可以直接引用函数,不用加前缀
但是,如果使用 from...import 导入 log 函数,势必引起冲突。这时,可以给函数起个“别名”来避免冲突

######动态导入模块
try:
    import json 
except ImportError:
    import simplejson 

print json.dumps({'python':2.7})

##########安装第三方模块
1.easy_install

2.pip install(推荐)

##########面向对象
类是模板,实例是根据类创建的对象
1.类:类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。
2.实例:创建实例使用类名+()的形式。

####__init__()方法
创建类的时候就给实例加上属性
__init__() 方法的第一个参数必须是 self,后续参数则可以自由指定,和定义函数没有任何区别。
setattr()设置属性
iteritems()获取字典的key,value

class Person(object):
    def __init__(self,name,gender,birth,**kw):
        self.name=name
        self.gender=gender
        self.birth=birth
        for k,v in kw.iteritems():
            setattr(self,k,v)

xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')

#####访问限制
属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问

如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性,
有很多预定义的特殊属性可以使用,通常我们不要把普通属性用"__xxx__"定义。

以单下划线开头的属性"_xxx"虽然也可以被外部访问,
但是,按照习惯,他们不应该被外部访问。

#############类的属性
类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!
也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。

######类的继承(复用已有的代码)
一定要用 super(classname, self).__init__(   ,     ) 去初始化父类
注意self参数已在super()中传入,在__init__()中将隐式传递,不需要写出(也不能写)。

#########判断类型
函数isinstance()可以判断一个变量的类型,
既可以用在Python内置的数据类型如str、list、dict,
也可以用在我们自定义的类,它们本质上都是数据类型。

###########多重继承
多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。

##########获取对象信息
type()获取变量类型
dir()获取变量的所有属性
getattr()获取对象的某个属性
setattr()设置对象属性

##############特殊方法(magic method)
__str__
__cmp__
__len__
__slots__   __slots__的目的是限制当前类所能拥有的属性,如果不需要添加任意动态的属性,使用__slots__也能节省内存。
一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
3年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这