#全局变量和局部变量
# name = 'alex'
# kk = ['a','b']
# def change_name():
# global name
# name = 'eric'
# kk.append(3)
# print('change_name',name,kk)
# # change_name()
# print(name,kk)
#没有global声明字段时
# -有局部变量声明
# 只作用于函数内部,无法对全局变量进行赋值,但可以对全局可变类型进行append/remove等操作
# -无局部变量说明
# 逐级往上寻找变量中对应的参数
# #有global声明字段时
# -有局部变量声明
# 可以修改和赋值该变量
# -无局部变量说明
# 直接从全局变量中获取
# name = 'aLEX'
# def func1():
# name = '11'
# print(name)
# def func2():
# name = '22'
# def func3():
# print(name)
# func3()
# print(name)
# func2()
# print(name)
# print(name)
# func1()
# print(name)
#对比如下两段代码,了解global和nolocal的区别,nonlocal只能更改上一级中的变量值
# def test1():
# name = '11'
# def test2():
# global name
# name = '22'
# print(name)
# test2()
# print(name)
# print(name)
# test1()
# print(name)
# def test1():
# name = '11'
# def test2():
# nonlocal name
# name = '22'
# print(name)
# test2()
# print(name)
# print(name)
# test1()
# print(name)
#递归函数
# import time
# person_list = ['alex','linhai','zhangsan','lisi']
# def askway():
# print('-'*30)
# if len(person_list) == 0:
# return 'Nobody Know!'
# person = person_list.pop()
# if person == 'alex':
# return '%s 说:我知道,银行在西街' %(person)
# print('hi %s,你知道银行在哪吗' %(person))
# print('%s说,我不知道,我帮你问问%s' %(person,person_list))
# time.sleep(3)
# res = askway()
# print('%s问的结果是 %s' %(person,res))
# return res
# print(askway())
# l = []
# def test(n):
# l.append(n)
# if n//2 == 1:
# return l
# n = n//2
# res = test(n)
# return res
# print(test(100))
#函数作用域
# name = 'alex'
# def foo():
# name = 'lihaixiang'
# def bar():
# print(name)
# def tt():
# global name
# name = 'zhangsan'
# print(name)
# return tt
# return bar
# print('运行前参数值',name)
# foo()()()
# print('运行后参数值',name)
# fun1 = lambda x:x+1 #匿名函数
# print(fun1(10))
# f = lambda x,y,z:(x+1,y+2,z+3)
# print(f)
# print(f(3,3,3))
#函数优化,需要尾调用:函数的最后一步才调用另一个函数
#高阶函数:1.函数的传入参数是一个函数名;2.函数的返回值是一个函数名
#非尾调用函数
# def cal(seq):
# print(seq)
# if len(seq) == 1:
# return seq[0]
# head,*tail=seq
# print(head)
# print(tail)
# return head+cal(tail)
# print(cal(range(10)))
#优化后的尾调用函数
# def cal(l):
# print(l)
# if len(l) == 1:
# return l[0]
# # first,second,*args =l
# first = l[0]
# second = l[1]
# l[0] = first + second
# l.pop(1)
# return cal(l)
# print(cal([i for i in range(10)]))
#或者
# print(cal(list(range(10))))
# v = range(10)
# print(list(v))
#map 函数:将列表中的元素,通过定义的函数进行逐个循环处理,返回一个'列表'(需要通过list进行转换),位置与原列表相同
# li = [1,2,3,4]
# def add_one(x):
# return x+1
# def map_test(func1,array):
# re = []
# for i in array:
# res = func1(i)
# re.append(res)
# return re
# print(map_test(add_one,li))
# print(map_test(lambda x:x+1,li))
# print(map(lambda x:x+1,li))
# print(list(map(lambda x:x+1,li)))
# filter函数:对列表中的元素逐个进行依据是前面的函数判断,如果判断结果为True,则保留列表元素,返回一个'列表'(需要通过list进行转换)
# f = ['alex','aboo','coobo']
# def check(x):
# return x.startswith('a')
# def filter_test(array):
# re = []
# for i in array:
# if check(i):
# re.append(i)
# return re
# print(filter_test(f))
# print(list(filter(check,f)))
# print(list(filter(lambda x:not x.startswith('a'),f)))
# dic = [
# {'name':'alex','age':100},
# {'name':'aoo','age':1000},
# {'name':'cbb','age':18},
# ]
# print(list(filter(lambda x:x['age'] <= 18,dic)))
# reduce函数:对列表内的所有元素进行前面的函数累计处理,并返回最终结果
from functools import reduce
r = [1,2,3,5]
# def add(x,y):
# return x+y
# def reduce_test(array,init=None):
# if init == None:
# s = array.pop(0)
# else:
# s = init
# for i in array:
# s = add(s,i)
# return s
# print(reduce_test(r))
# print(reduce_test(r,100))
# print(reduce(lambda x,y:x+y,r,1000))
print(reduce(lambda x,y:x+y,r))
#内置函数
# #abs 取绝对值
# print(abs(-34))
# #all 对列表内所有元素进行bool运算,只有所有结果都为True时,返回True;如果列表为空,也返回True
# print(all(['xx',1,3]))
# print(all(['xx',1,3,'']))
# print(all([]))
# print(bytes('你好',encoding = 'utf-8'))
# print(bytes('你好',encoding = 'utf-8').decode('utf-8'))
# #dir打印某一个对象下的所有方法
# print(dir(int))
# #divmod 除法算商和余数,可以用来分页
# print(divmod(100,6))
#eval将字符串内的数据类型输出,或者直接数字运算后输出
# dic = {'name':'alex','age':18}
# # print(dic['name'])
# s = str(dic)
# print(s,type(s))
# print(eval(s),type(eval(s)))
# s1 = '1+2+3'
# print(eval(s1))
#hash,计算一个文件的唯一值
# name = '123ss'
# print(hash(name))
# #help 查看一些命令的具体作用
# print(help(map))
#bin,hex,oct 进制转换
# print(bin(13)) #10进制-> 2进制
# print(hex(13)) #10进制-> 16进制
# print(oct(13)) #10进制-> 8进制
#isinstance 判断是否属于某个数据类型,返回布尔值
# print(isinstance(1,int))
# print(isinstance('sss',str))
# print(isinstance([],list))
# print(isinstance((),tuple))
# print(isinstance({''},set))
# print(isinstance({},dict))
#globals打印出当前所有的全局变量
#locals打印出当前的局部变量
# a = 11111222233334444555677
# def test():
# b = '221ssssssssssssss'
# print(globals())
# print(locals())
# test()
#zip 将两个字符串或者列表一一组合成多个元组组成的列表
# print(list(zip('12345','abcde')))
# print(list(zip(['12','23','34'],['aa','bb','cc'])))
# print(list(zip(['12','23','34'],['aa','bb','cc','dd'])))
#max,min通过for循环比较大小,如果是字符串则从前往后逐个字符进行比较
# s = ['a','b','c']
# print(max(s))
# print(max(1,2,3))
# #print(max('s',1,2,3)) #会报错,不同数据类型之间无法比较
# dic = [{'name':'alex','age':18},{'name':'aboo','age':1000},{'name':'brit','age':100}]
# print(max(dic,key=lambda x:x['age']))
# #sorted,与比较大小类似,只是从小到大进行排序,返回一个序列
# s = ['a','de','c','bb']
# print(sorted(s))
# print(sorted([1,9,4,3,5]))
# #print(max('s',1,2,3)) #会报错,不同数据类型之间无法比较
# dic = {'zhang':133,'li':20,'wang':3999}
# print(max(zip(dic.values(),dic.keys())))
# l = [{'name':'alex','age':18},{'name':'aboo','age':1000},{'name':'brit','age':100}]
# print(sorted(l,key=lambda x:x['age']))
# #chr ord ascii码对应的数字和符号之间相互转换
# print(chr(89))
# print(ord('1'))
#pow 相当于x**y, x**y%z
# print(pow(3,2))
# print(pow(3,3,2))
#reversed将序列反向输出
# s = 's1243asd'
# l = ['s','1','333',22,(33,12)]
# s_r = reversed(s)
# l_r = reversed(l)
# print(list(s_r))
# print(list(l_r))
#round四舍五入取整
# print(round(0.7))
# print(round(123.456))
#slice 定义切片
# s = 's123jjss'
# v = slice(1,5)
# v1 = slice(1,5,2)
# print(s[v])
# print(s[v1])
#__import__ 通过字符串导入文件名,通过情况下,import test, 如果获取到的test是字符串,则需要
# import day9_1 #可以直接调用文件名
#import 'day9_2' #会报错,因为无法直接调用字符串
# __import__('day9_1')