day16作用域和内置函数

import os
name= 'alex'
def foo():
name= 'lihaig'
def bar():
print(name)

return bar
foo()

匿名函数
lambda x:x+ 1
def calc( x)
return x+1

res=calc( 10)
print( res)

匿名函数不能使用较为复杂的逻辑
匿名函数返回值需要作为整体的返回


十:函数式编程
11高阶函数
满足两个特性任意一个即为高阶函数
1.函数的接收参数是一个函数名
2.函数的返回值是一个函数名

编程的方法论
面向过程
面向函数式
面向对象
1.搜索目标
2.表白,表白成功进入3,否则2
3.恋爱,恋爱成功进入,4,否则1
4.见家长,家长同意进入5,否则1


函数式编程
函数式:编程语言定义的函数+数学意义的函数
函数即变量
#把函数的返回值传递给另外一个函数
def foo( n):
print(n)
def bar( name):
print( 'jajg',name)
#foo(bar)
foo(bar( 1))
伪递归调用优化,在函数的最后一部调用
map 函数
num_1=[ 1, 2, 3, 4, 5, 6, 7, 8, 77]
# def map_test():
# ret=[]
# for i in num_1:
# ret.append(1**2)
# return ret
# ret=map_test(num_1)
# rett=map_test(num_1)
# print(num_1)
# print(rett)
#lambda x:x-1
def reduce_one( x):
return x- 1

def map_test( func, args):
ret=[]
for i in args:
res=func(i)
#ret.append(i+1)
ret.append(res)
return ret
print(map_test(reduce_one,num_1))
print(map_test( lambda x:x- 1,num_1))
print( '内置函数map,处理结果', map( lambda x:x- 1,num_1))
a= map( lambda x:x- 1,num_1)
print( list(a))

msg= 'lajgagag'
print( list( map( lambda x:x.upper(),msg)))

filter 函数
#filter 函数
#filter()
movie_people = [ 'sjg_sb', 'aghadg', 'sb_ag', 'sb_ag']
#filter(lambda n:n.endswith('sb'),movie_people)
ls= filter( lambda n:n.endswith( 'sb'),movie_people)
print( list(ls))
#第一个是函数,第二个是一个可以迭代的对象
#reduce函数
import os
# movie_people = ['sjg', 'aghadg', 'sb_ag', 'sb_ag']
# def sb_show(n):
# return n.endswith('sb')
# def filter_test(arrg):
# ret = []
# for a in movie_people:
# if not a.startwith('sb_'):
# ret.append(a)
# print(ret)
# return ret
# res=filter_test(movie_people)
# #filter 函数
#movie_people = ['sjg', 'aghadg', 'sb_ag', 'sb_ag']
# def filter_tesq(func,args):
# fet=[]
# for p in args:
# if not func(p):
# fet.append(p)
# return fet
# res=filter_tesq(lambda n:n.endswith('sb'),movie_people)
# print(res)
#filter 函数
#filter()
movie_people = [ 'sjg_sb', 'aghadg', 'sb_ag', 'sb_ag']
#filter(lambda n:n.endswith('sb'),movie_people)
ls= filter( lambda n:n.endswith( 'sb'),movie_people)
print( list(ls))
from functools import reduce

-------------------- reduce 函数--------------
# num_l=[1,3,4,5,4,64,6]
# res=0
# for num in num_l:
# res+=num
#
# print(res)
#
# num_l=[1,3,5]
#
# def multi(x,y):
# return x*y

# def reduce_test(func,array):
# res=num_l[0]
# for num in array:
# res=func(res,num)
# return res
# print(reduce_test(multi,num_l))

# def reduce_test(func,arry,init=None):
# if init is None:
# res = arry.pop(0)
# else:
# res = init
# for num in arry:
# res=func(res,num)
# return res
# print(reduce_test(lambda x,y:x*y,num_l,))

#reduce 函数 数据合并
#filter 函数 对里面的值进行筛选
#map 函数 依次处理每个值

num_l1=[ 1, 3, 5]

print( reduce( lambda x, y:x*y,num_l1, 5))
===================map函数==============
num_1=[ 1, 2, 3, 4, 5, 6, 7, 8, 77]
# def map_test():
# ret=[]
# for i in num_1:
# ret.append(1**2)
# return ret
# ret=map_test(num_1)
# rett=map_test(num_1)
# print(num_1)
# print(rett)
#lambda x:x-1
def reduce_one( x):
return x- 1

def map_test( func, args):
ret=[]
for i in args:
res=func(i)
#ret.append(i+1)
ret.append(res)
return ret
print(map_test(reduce_one,num_1))
print(map_test( lambda x:x- 1,num_1))
print( '内置函数map,处理结果', map( lambda x:x- 1,num_1))
a= map( lambda x:x- 1,num_1)
print( list(a))

msg= 'lajgagag'
print( list( map( lambda x:x.upper(),msg)))

----------------------内置函数-----------------------


#第一个是函数,第二个是一个可以迭代的对象
#绝对值
# print(abs(-1))
#all全部,进行布尔运算,只要有一个为假,就是假
# print(all([1,2,3,'dhgag']))
# print(all([1,2,3,'dhgag','']))
#any只要有一个为真就是真的
# print(any('1'))
#空,None,0 的布尔值为False,其余都是True

# print(bool(''))
# print(bool(None))
# print(bool(0))
#bytes
# name='欧阳'
# print(bytes(name,encoding='utf-8'))
# print(bytes(name,encoding='utf-8').decode('utf-8'))#python3 默认的解码格式为 utf-8
#print(bytes(name,encoding='ascii'))#ascii 不嫩编码中文
#chr ascii 表的转换
# print(chr(97))
# #dir() 打印某一个对象下面有哪些方法
# print(dir(dict))
#eval函数
#取字典里面的字符串的结构截取下来
#hash 可以hash 的数据类型是不可变类型,不可hash 类型就是可变类型
# print(hash('hgahg'))
# #help 打印解释
# print(help(dir(all)))
#进制转换
# print(bin(10))#10进制 2进制
# print(hex(12))#10进制- 16进制
# print(oct(12))#10进制换 8进制
# #判断类型,并且进行布尔运算
# print(isinstance(1,int))
# print(isinstance([],list))
# print(isinstance({},dict))
# print(isinstance({1,2},set))
======================format字符串处理=============================
#常用的格式
#1
#rt='i am {}, age {},{}'.format('sle',18,'睡觉') 自动的添加
#rt='i am {2}, age {1},{}'.format('sle',18,'睡觉') 按照自定义的顺序进行排序
# rt='i am {name}, age {age},stu {sj}'.format(**{'name':'hahg','age':'hahg','sj':'hahg'}) #字典的数据类型,必须要加上一个**
# print(rt)
# rt1='number:{:b},{:c}.{:d}'.format(15,20,25)#b是二进制
# print(rt1)
# def test(a,*args):
# print(a)
# print(args)
# print(args[0][2])
# test(1,[1,23,43,53])
#test(1,{1,2,4,6})
# def tesq(a,*args,**kwargs):#字典类型
# print(a)
# print(args)
# print(kwargs)
#
# tesq(1,t=2,y=4)
# #位置参数必须一一对应
# #一个参数不能传递2遍值,会报错
# #*args,**kwargs
# #顺序只能这样
# tesq(1,*[1,2,3],**{'y':2,})

=====================字符串格式输出==============================
#把字符串进行拼接输出
a= 'oulen'
b= 'hh'
print( 'i am %s my hobby is %s'%(a,b))
c= 'ja'

msg= 'i am %s my hobby is %d'%( 'ks', 1)
print(msg)
#打印浮点数
tpu1= 'percent %.2f %%' % 99.55457 #加上%
tpu= 'percent %.2f' % 99.55457 #进行
print(tpu1)
tpu2= 'i am %(name)-60s my hobby is alex' %{ 'name': 'lej'} #键值对添加
print(tpu2)
#%s 字符串等任意类型 %d 是int 类型

=========================字典=======================
dic={
'植物':
{ "草本植物":
[ '牵牛花', '刮花距', '葫芦'],
'水生植物':
[ '乔木', '杉']
},
'动物':
{ '两栖动物':
[ '山鬼']

}


}
# li = []
# go = True
#
# for v in enumerate(dic,1):
# print(v)
# #li.append(v)
# print(li)
# while go:
# for i,v in enumerate(dir,1):
# print(i,v)
# li.append()
# v_c=str(input('>>>'))
# if v_c.isdigit():
# pass
# elif v_c.isalpha():
# v_c=v_c.lower()
# if v_c==i:
# lx=input('类型:')
# if dic.get(lx,1)==1:
# dic[lx]={}
#
# zl= input('种类:')
# if dic.get(lx[zl],1)==1:
# dic[lx][zl]=[]
# mc=input('名称:')
db={
'北京':
{
'昌平':
{
'沙河':{},
'回龙观':{},
},
'西郊':{},
'朝阳':{}
},
'上海':
{



}
}

# q=input(">>>")
# db[q]={}
# print(db)

path=[]
while True:
temp = db
for item in path:
temp=temp[item]
print( "当前可选的所有节点", list(temp.keys()))
choice= input( '1.添加节点;2.查看节点(Q/B); \n >>>')
if choice == '1':
name= input( "输入要添加的节点名称")
temp[name]={}
elif choice == '2':
name= input( "输入你想要查看的节点名称:")
path.append(name)
elif choice.lower() == 'b':
path.pop()
elif choice.lower() == 'q':
break
else:
print( "输入错误,重新输入")

# while True:
# chose=input('1.添加节点;2.查看节点(Q/B);\n>>>')
# if chose=='1':
# pass
# elif chose==2:
# pass
# elif chose.lower()==b:
# pass
# elif
#
# print('全部的节点',db.keys())

========================匿名函数=====================
import os
# lambda x:x+1
# def calc(x):
# return x+1
#
# res=calc(10)
# print(res)
# print(calc)
# print(lambda x:x+1)
# func=lambda x:x+1
# print(func(10))
#
# name='jjfj'
# def chang_name(x):
# return name+'_sb'
# re=chang_name(name)
# print(re)
# f=lambda x:name+'_sb'
# f(name)
#
#把函数的返回值传递给另外一个函数
# def foo(n):
# print(n)
# def bar(name):
# print('jajg',name)
# #foo(bar)
# foo(bar(1))
#返回值包含函数
def bar():
print( 'from bar')
def foo():
print( 'from foo')
return bar
n=foo()
n()
#返回值可以是任意函数

num_1=[ 1, 2, 3, 4, 5, 6, 6]
ret=[]

for i in num_1:
ret.append(i** 2)

print(ret)



=====================小结============================
from functools import reduce

#处理序列中的每个元素,得到的结果是一个列表,该列表是元素个数和位置与原来一样
#map()

#filter 遍历序列中每个元素,判断每个元素得到的布尔值,如果是True则保留下来

people=[
{ 'name': 'alex', 'age': 1000},
{ 'name': 'wupeiuae', 'age': 10000},
{ 'name': 'yuanhao', 'age': 100000},
{ 'name': 'lianghaife', 'age': 18},
]
print( list( filter( lambda p:p[ 'age']<= 18,people))) #filter()函数是留下需要保留的结果

#reduce 处理一个序列,然后把序列进行合并操作
#计算1到100的值
print( reduce( lambda x, y:x+y, range( 100), 100))
print( reduce( lambda x, y:x+y, range( 1, 101)))



===========================列表=================
import os
li = [ 1, 2, 3, 'jghg',[ 23, 34, 'gf'], 'nin']
li[ 1: 3] = [ 45, 54]
print(li)
#########索引删除
li = [ 1, 2, 3, 'jghg',[ 23, 34, 'gf'], 'nin']
v = 1 in li
#del li[3:4]
print(v)
a = li[ 4][ 0]
print(a)
li = [ 1, 2, 3, 'jghg',[ 23, 34, 'gf'], 'nin']
s = ''
for i in li:
s=s+ str(i)
print(s)
#直接使用字符串,可以使用join进行转换
#########切片删除
li.count( '5')
li.clear()
c=li.count( 'l') #计算可以元素出现次数
print(c)
li.append([ 98, 985]) #整体的添加
li.extend([ 98, 585]) #扩展原来的列表
li.pop() #默认删除最后一个
li.remove( '22') #删除列表中的值
li.reverse() #将当前列表进行反转
li.sort() #进行排序,默认从小到大
tu = ( 111, 'alex',( 11, 22),[( 33, 44)], True, 33, 44,)
tu[ 3][ 0]= 11
print(tu)
ac=tu.count( 'alex')
ac1=tu.index( 'alex')
print(ac,ac1)

info = {
"k1": 18,
2: True,
"k3": [
11,
[],
(),
22,
33,
{
'kk1': 'vv1',
'kk2': 'vv2',
'kk3': ( 11, 22),
}
],
"k4": ( 11, 22, 33, 44)
}
# v = info['k1']
# print(v)
# v = info[2]
# print(v)
v = info[ 'k3'][ 5][ 'kk3'][ 0]
print(v)


day12列表
Python主要有三种数据类型:字典、列表、元组。其分别由花括号,中括号,小括号表示。
如:
字典:dic = { 'a': 12, 'b': 34}
列表: list = [ 1, 2, 3, 4]
元组:tup = ( 1, 2, 3, 4)
v = "李杰"
for item in v:
print(item)
###################################################################################################
str
name = "alex"
list # 类,列表
li = [ 1, 12, 9, "age", [ "石振文", [ "19", 10], "庞麦郎"], "alex", True] # 通过list类创建的对象,li
list
list类的一个对象
######################################灰魔法: list类中提供的方法 #######################################
li = [ 11, 22, 33, 22, 44]
参数
1.
原来值最后追加
对象.方法(..) # li对象调用append方法
li.append( 5)
li.append( "alex")
li.append([ 1234, 2323])
print(li)
2
清空列表
li.clear()
print(li)
3
拷贝,浅拷贝
v = li.copy()
print(v)
4.
计算元素出现的次数
v = li.count( 22)
print(v)
5.
扩展原列表,参数:可迭代对象
li = [ 11, 22, 33, 22, 44]
li.append([ 9898, "不得了"])
[ 11, 22, 33, 22, 44, [ 9898, '不得了']]
li.extend([ 9898, "不得了"])
for i in [ 9898, "不得了"]:
li.append(i)
[ 11, 22, 33, 22, 44, 9898, '不得了']
li.extend( "不得了")
print(li)
6.
根据值获取当前值索引位置(左边优先)
li = [ 11, 22, 33, 22, 44]
v = li.index( 22)
print(v)
7.
在指定索引位置插入元素
li = [ 11, 22, 33, 22, 44]
li.insert( 0, 99)
print(li)
8、 删除某个值( 1.
指定索引; 2.
默认最后一个),并获取删除的值
li = [ 11, 22, 33, 22, 44]
v = li.pop()
print(li)
print(v)
li = [ 11, 22, 33, 22, 44]
v = li.pop( 1)
print(li)
print(v)
9.
删除列表中的指定值,左边优先
li = [ 11, 22, 33, 22, 44]
li.remove( 22)
print(li)
PS: pop
remove
del li[ 0]
del li[ 7: 9]
clear
10
将当前列表进行翻转
li = [ 11, 22, 33, 22, 44]
li.reverse()
print(li)
11
列表的排序
li = [ 11, 44, 22, 33, 22]
li.sort()
li.sort( reverse= True)
print(li)
## 欠
cmp
key
sorted
# 元组,元素不可以修改,不能被增加或者删除
# 元组的一级元素不可以修改,删除,增加
# tuple
tu = ( 111, 'alex', ( 11, 22), [( 33, 44)], True, 33, 44,) # 元组最后面加上一个逗号
v = tu[ 0]
v1 = [ 0: 2]
元组可以进行for
循环
for item in tu:
print(item)
列表的extend方法
元组是有序的
####################################### 深灰魔法 #######################################
1.
列表格式
2.
列表中可以嵌套任何类型
中括号括起来
,分割每个元素
列表中的元素可以是
数字,字符串, 列表,布尔值..所有的都能放进去
“集合”,内部放置任何东西
3.
索引取值
print(li[ 3])
4
切片,切片结果也是列表
print(li[ 3:- 1])
5
for循环
while循环
for item in li:
print(item)
列表元素,可以被修改
li = [ 1, 12, 9, "age", [ "石振文", [ "19", 10], "庞麦郎"], "alex", True]
6
索引
修改
li[ 1] = 120
print(li)
li[ 1] = [ 11, 22, 33, 44]
print(li)
删除, 第一种方式
del li[ 1]
print(li)
############# 7 切片
修改
li[ 1: 3] = [ 120, 90]
print(li)
删除
del li[ 2: 6]
print(li)
8 in 操作
li = [ 1, 12, 9, "age", [ "石振文", [ "19", 10], "庞麦郎"], "alex", True]
v1 = "石振文" in li
print(v1)
v2 = "age" in li
print(v2)
列表中的元素,
9
操作
li = [ 1, 12, 9, "age", [ "石振文", [ "19", 10], "庞麦郎"], "alex", True]
li[ 4][ 1][ 0]
[ 1]
li = [ 1, 12, 9, "age", [ "石振文", [ "19", 10], "庞麦郎"], "alex", True]
s = "pouaskdfauspdfiajsdkfj"
s = 123
a = "123"
int(a)
a = 123
str(a)
10
转换
字符串转换列表
li = list( "asdfasdfasdf"), 内部使用for循环
s = "pouaskdfauspdfiajsdkfj"
new_li = list(s)
print(new_li)
列表转换成字符串,
需要自己写for循环一个一个处理: 既有数字又有字符串
li = [ 11, 22, 33, "123", "alex"]
# r = str(li) # '[11,22,33,"123","alex"]'
# print(r)
s = ""
for i in li:
s = s + str(i)
print(s)
直接使用字符串join方法:列表中的元素只有字符串
li = [ "123", "alex"]
v = "".join(li)
print(v)
补充:字符串创建后,不可修改
v = "alex"
v = v.replace( 'l', 'el')
print(v)
li = [ 11, 22, 33, 44]
li[ 0]
li[ 0] = 999
s = "alex"
li[ 0]
s[ 0] = "E"
li = [ 11, 22, 33, 44]
print(li)
print(li)
print(li)
print(li)
print(li)
print(li)
print(li)
print(li)
列表,有序;元素可以被修改
列表
list
li = [ 111, 22, 33, 44]
####################################################################################################
元组
元组,元素不可被修改,不能被增加或者删除
tuple
tu = ( 11, 22, 33, 44)
tu.count( 22), 获取指定元素在元组中出现的次数
tu.index( 22)
####################################### 深灰魔法 #######################################
1.
书写格式
tu = ( 111, "alex", ( 11, 22), [( 33, 44)], True, 33, 44,)
一般写元组的时候,推荐在最后加入,
元素不可被修改,不能被增加或者删除
2.
索引
v = tu[ 0]
print(v)
3.
切片
v = tu[ 0: 2]
print(v)
4.
可以被for循环,可迭代对象
for item in tu:
print(item)
5.
转换
s = "asdfasdf0"
li = [ "asdf", "asdfasdf"]
tu = ( "asdf", "asdf")
v = tuple(s)
print(v)
v = tuple(li)
print(v)
v = list(tu)
print(v)
v = "_".join(tu)
print(v)
li = [ "asdf", "asdfasdf"]
li.extend(( 11, 22, 33,))
print(li)
6.
元组的一级元素不可修改 / 删除 / 增加
tu = ( 111, "alex", ( 11, 22), [( 33, 44)], True, 33, 44,)
元组,有序。
v = tu[ 3][ 0][ 0]
print(v)
v = tu[ 3]
print(v)
tu[ 3][ 0] = 567
print(tu)
####################################################################################################
字典
1.
字典的形式
info = {
'k1': 'v1'
'k2': 'v2'
}
2.
布尔值,列表,字典不能作为key
3.
字典无序的
4.
value
可以是任何值,
5.
索引方式找到指定元素
info = {
"k1": 18,
2: True,
"k3": [
11,
[],
(),
22,
33,
{
'kk1': 'vv1',
'kk2': 'vv2',
'kk3': ( 11, 22),
}
],
"k4": ( 11, 22, 33, 44)
}
v = info[ 'k1']
print(v)
v = info[ 2]
print(v)
v = info[ 'k3'][ 5][ 'kk3'][ 0]
print(v)
dic = {
'l1': '1',
'l2': '2',
'k3': 'k3',
'k4': "4",
}
1.
根据序列,创建字典,并且根据对应的创建key
v = dict.formkeys([ 'k1', 'j3', 'yh'], 123)
print(v)
2.
获取key的值
v = dir[ 'j3']
print(v)
v = dic.get( 'l1', 222)
3.
指定key
删除列表中的指定值
dic = {
'l1': '1',
'l2': '2',
'k3': 'k3',
'k4': "4",
}
v = dic.pop( 'k3', 90)
print(v)
k, v = dic.popitem()
print( dir, k, v)
4.
设置值,如果已经存在,则获取到当前key
对应的值,如果不存在,则获取到新的值
v = dic, setdefault( 'k3', '123')
5.
更新值
dic.update({ 'k1': 'jg', 'hg': 'kjg'})
dic.update( k1= 123, k2= 'rer', k5= 'hdhg')
6.
重点,keys()
values()
items()
dr = {
name = {id1: 'ou' , id2 = 'jd' }
}
###########################
整理
1、数字
int(..)
2、字符串
replace, find, join, strip, startswith, endswith, split, upper, lower, formate
3、列表
append, extend, insert, remove, pop
索引,切片,循环
4、元组
索引,切片,循环
一级元素不可以修改
5、字典
get, update, keys, values, items
# for 索引
dic = {
k1 = 123 , k3 = 345 , k5 = "asdf"
}
v = 'k1' in dic
v = 'k1' in dir.values()
6、布尔值
0, 1
bool
None
''()[]
{}
0 -> > False

猜你喜欢

转载自blog.csdn.net/qq_37311616/article/details/80401419