python基础知识四

博客参考老师文章:http://www.cnblogs.com/wupeiqi/ 

博客参考老师文章:http://www.cnblogs.com/luotianshuai/

知识点

def函数的坑

li = [11,22,33,44]
def f1(arg):
    arg.append(55)

li = f1(li)     # 因为函数中没有return,所以默认返回None(li = None)
print(li)       # None

f1(li)
print(li)       # [11, 22, 33, 44, 55]

今日知识:

一、lambda表达式

 lambda表达式,也是简单的函数:

# ###################### 普通函数 ######################
# 定义函数(普通方式)
def func(arg):
    return arg + 1
  
# 执行函数
result = func(100)

print (result)   # 101
# ###################### lambda ###################### # 定义函数(lambda表达式) my_lambda = lambda arg : arg + 1 # 执行函数 result = my_lambda(100)
print (result)         # 101 

#自动返回return
f1 = lambda a: a > 20

ret = f1(30)
print(ret)      #True

二、内置函数

abs()

print(abs(-1))
#返回绝对值 1

all()

li = [11,22,33]
print(all(li))
#所有为真时,则返回True    True

l2 = [11,22,0]
print(all(l2))
#有一个为假时,则返回False

any()

l1 = [0,0,[],()]
print(any(l1))
#所有为假时,则返回False

l2 = [1,0,[],()]
print(any(l2))
#有一个为真时,则返回True    True
bin()
print(bin(10))
#返回一个二进制数   0b1010 

bytes()

s = "于晓艳"
print(bytes(s,encoding='utf-8'))
#以utf-8的形式返回一个值    b'\xe4\xba\x8e\xe6\x99\x93\xe8\x89\xb3'

callable()

def f1():
    print("hello world")

c = callable(f1)
print(c)        #Ture
#查看参数是否可以被调用

chr() & ord()

print(chr(65))
#接收一个数字,返回acsii表中对应的值   A

 print(ord("A"))

 #接收一个值,返回acsii表中对应的值 65

 

bool()

print(bool("a"))            #True
print(bool([]))             #False
#根据参数,返回False或True

 dir(),help()

print(dir(list))

"""
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', 
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', 
'__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
'__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__',
'__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 
 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
"""

help(list)
"""
Help on class list in module builtins:

class list(object)
 |  list() -> new empty list
 |  list(iterable) -> new list initialized from iterable's items
 |  
 |  Methods defined here:
 |  
 |  __add__(self, value, /)
 |      Return self+value.
...............

"""

# 快速查看,对象提供了那些功能

divmod()

r = divmod(100, 10)
print(r)            #(10, 0)
# 返回一个元组,第一个元素代表商,第二个元素代表余数
a1,a2 = divmod(100,9)
print(a1,a2)
 

isinstance()

s = [11,11,11]
# 用于判断,对象是否是某个类的实例
r = isinstance(s,list)
print(r)            #True

filter(函数,可迭代的对象)

#filter,循环第二个参数,让每个循环的元素,执行参数一(函数);当执行结果返回True,则接收,返回False,中丢弃
li = [11,22,33,44,55]
def f1(arg):
    if arg > 22:            # 过滤,比较
        return True
result = filter(f1,li)
print(list(result))
#[33, 44, 55]

#filter内部,循环第二个参数
# for item in li:
# r = f1(item)
# if r:
# result(item)
# return result

 compile()

s = """for i in range(4):
    print(i) """
#编译,编译模式(single(单行),eval(表达式),exec(跟python一样的))
r = compile(s,"sting","exec")
#执行python代码,接收:代码或都字符串
exec(r)

s ="print([11,22,33,44])"
r = compile(s,"string",'exec')
result = eval(r)                # [11, 22, 33, 44]
print(result)                   # None

#执行表达式,并且获取结果
a = "8 * 8"
res = eval(a)                    #
print(res)                       # 64

 map()

#map('函数',"可迭代的对象")
#正常实现功能 li
= [11,22,33,44,55,] def f2(arg): result = [] for i in arg: result.append(i + 100) return result s = f2(li) print(s) # [111, 122, 133, 144, 155]
#使用map()实现功能 li = [11,22,33,44,55,] def f2(args): return args + 100 result = map(f2,li) print(list(result)) # [111, 122, 133, 144, 155]

#使用map()加lambda,实现功能 result = map(lambda a: a+100,li) print(list(result)) # [111, 122, 133, 144, 155]

float()

#返回一个浮点数
print(float(50))
# 50.0

globals()  & locals()

NAME = 'RAIN'
def show():
    s = 123
    print(locals())
    print(globals())
show()

#{'s': 123}

#{'__package__': None, 'NAME': 'RAIN', '__cached__': None,
 '__name__': '__main__', '__spec__': None,
 '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000000000685908>,
'__file__': 'E:/PyCharm4.5.2/PyCharm 文件/day4/内置函数.py', '__doc__': None,
'show': <function show at 0x0000000000B3F730>, '__builtins__': <module 'builtins' (built-in)>}

hash() 用来将对象转换成hash值,一般用来做字典的key转换

ha = "hash hash"
print(hash(ha))

#-1596869942863300395

hex()

#十进制转十六进制
print(hex(100))
#0x64

id()

#查看参数的内存地址
print(id("abc"))
#6587872

input()

#默认接收一个字符串的值
str = input("hello world:")
print(str)

# hello world:hello world
# hello world

int()

#将字符串中的数字转换成int
a = int("11")
print(a,type(a))
#11 <class 'int'>

len()

#查看该列表中总共有几个元素
li = [11,22,33,44,]
print(len(li))

a = "于晓艳"
print(len(a))
#python3.x 默认返回 3

a = "于晓艳"
b = bytes(a,encoding='utf-8')
print(len(b))
# 返回 9
# b'\xe4\xba\x8e\xe6\x99\x93\xe8\x89\xb3'

max() & min() & sum()

li = [11,6,99,34,100]
print(max(li))              #最大值   100
print(min(li))              #最小值    6
print(sum(li))              #元素之和  250

oct()

#十转十六
print(oct(100))
#   0o144

pow()

#返回n的n次方
r = pow(2,10)
print(r)            #1024

reversed()

li = [11,22,33,44]
print(list(reversed(li)))

#  [44, 33, 22, 11]

round()

print(round(11.1))      # 11
print(round(11.9))      # 12
vars()   #指当前模块中有哪些变量可供使用
zip()
li = ["rain",11,22,33]
l2 = ["sunny",11,22,33]
l3 = ["ray",11,22,33]
print(list(zip(li,l2,l3)))
[('rain', 'sunny', 'ray'), (11, 11, 11), (22, 22, 22), (33, 33, 33)]

li = ["rain",11,22,33]
l2 = ["sunny",11,22]
print(list(zip(li,l2)))
#  [('rain', 'sunny'), (11, 11), (22, 22)]

r = zip(li,l2,l3)
temp = list(r)[0]
a = " ".join(temp)
print(a)
# rain sunny ray

三、 装饰器

# 装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作。
# 简单的来说在不修改原函数的情况下,在对原函数进行包装!

1、基础原代码
############### 基础平台提供的功能如下 ###############
def f1():
    print("f1")

def f2():
    print("f2")

def f100():
    print("f100")

############### 业务部门A 调用基础平台提供的功能 ###############

f1()
f2()
f3()
f4()
############### 业务部门B 调用基础平台提供的功能 ############### f1() f2() f3() f4() 
2、现需要对基础平台的所有功能进行重构,为平台提供的所有功能添加验证机制,即:执行功能前,先进行验证。
1)只对基础平台的代码进行重构,让N业务部门无需做任何修改
############### 基础平台提供的功能如下 ############### 

def f1():
    # 验证1
    # 验证2
    # 验证3
    print 'f1'

def f2():
    # 验证1
    # 验证2
    # 验证3
    print 'f2'

def f3():
    # 验证1
    # 验证2
    # 验证3
    print 'f3'

def f4():
    # 验证1
    # 验证2
    # 验证3
    print 'f4'

############### 业务部门不变 ############### 
### 业务部门A 调用基础平台提供的功能### 

f1()
f2()
f3()
f4()

### 业务部门B 调用基础平台提供的功能 ### 

f1()
f2()
f3()
f4()
实现方法一
2)只对基础平台的代码进行重构,其他业务部门无需做任何修改
############### 基础平台提供的功能如下 ############### 

dic = {"username":"rain"}
def check(arg):
    for i in arg:
        if arg[i] == "rain":
            print("用户输入正确")
            return arg

def f1():
    check(dic)
    print("log")
    print("f1")

def f2():
    check(dic)
    print("log")
    print("f2")

def f100():
    check(dic)
    print("log")
    print("f100")

########调用函数########

f1()
f2()
f100()

########调用结果#########

用户输入正确
log
f1
定义一个函数,让每一个基层函数调用这个函数

 

写代码要遵循开发封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即:

  • 封闭:已实现的功能代码块
  • 开放:对扩展开发
3)如果将开放封闭原则应用在上述需求中,那么就不允许在函数 f1 、f2、f3、f4的内部进行修改代码
def outer(func):
    def check():
        print("log")
        func()
        print("end")
    return check

@outer
def f1():
    print("f1")

@outer
def f2():
    print("f2")

@outer
def f100():
    print("f100")
#########调用函数#########
f2()

#########执行结果#########
log
f2
end
3、详细讲解装饰器
def outer(func):
    def inner():
        print('berfore')
        func()
        print("after")
    return inner

# @ + 函数名
#功能:
#       1、自动执行outer函数并且将其f1()的函数名 当做参数执行
#       2、将装饰器函数的返回值,重新赋值给f1()

@outer
def f1():
    print("F1")

f1()

 对比下面俩图,自己体会

装饰器参数
1、不带参数
def outer(func):
    def inner():
        print('berfore')
        func()
        print("after")
    return inner

@outer
def f1():
    print("F1")


#######执行结果#########

berfore
F1
after
2、带一个参数
####由于f1()需要一个参数,而定义装饰器时并没有给定这个参数,so:在加入装饰器时会报错

def outer(func):
    def inner():
        print("before")
        func()
        print("after")
    return inner

# @outer
def f1(arg):
    print(arg)
    return "传递参数"

a = f1("hello ")
print(a)
##########执行结果############
#不加装饰器之后
"""
hello
传递参数
"""

#加装饰器之后报错
"""
Traceback (most recent call last):
  File "E:/PyCharm4.5.2/PyCharm 文件/day4/funct.py", line 366, in <module>
    a = f1("hello ")
TypeError: inner() takes 0 positional arguments but 1 was given
"""
加入装饰器时会报错

def outer(func):
    def inner(arg):
        print("before")
        r = func(arg)
        print("after")
        return r
    return inner

@outer
def f1(arg):
    print(arg)
    return "传递参数"

a = f1("hello ")
print(a)

###########执行结果############
"""
before
hello 
after
传递参数
"""
正确的使用装饰器,传递参数
3、带二个参数
def outer(func):
    def inner(arg,kwarg):
        print("before")
        r = func(arg,kwarg)  
        print("after")
        return r      #返回f1()的返回值(传递参数)
    return inner

@outer
def f1(arg,kwarg):
    print(arg)
    print(kwarg)
    return "传递参数"

a = f1("hello","world")
print(a)

###########执行结果############
"""
before
hello
world
after
传递参数
"""
这样一个个添加实在太麻烦啦(动态参数,不要太方便哦!)
#之前学过万能参数(动态参数),用在这里实现太方便啦
def outer(func):
    def inner(*arg,**kwarg):
        print("before")
        r = func(*arg,**kwarg)
        print("after")
        return r
    return inner

@outer
def f1(*arg,**kwarg):
    print(arg)
    print(kwarg)
    return "传递参数"

a = f1()
print(a)
#####执行结果######
"""
before
()
{}
after
传递参数
"""
########################################
a = f1(["alex",11,33],**{"name":"rain"})
print(a)

"""
before
(['alex', 11, 33],)
{'name': 'rain'}
after
传递参数
"""

 未完待续!!!

 

posted @ 2016-06-01 11:26  yxy_linux  阅读(224)  评论(0编辑  收藏  举报