函数,全局变量与局部变量
在编程语言中,由于常常会编写相当长的一段代码或者说海量的代码,在编写完成后,是否如果想要修改某一处,但是编写过程中没有做区分的话就很难找到想要修改的地方,这时候函数的作用就体现出来了,函数在编程中起的作用是将程序的执行语句模块化。
Python中定义函数的方法:
def add(): #Python中定义函数的前缀必须有def(匿名函数除外)
print("Hello Word") #函数的语句,函数体
add() #调用函数,调用时不需要加def,程序中的函数在不进行调用的情况下是不会起作用的,需要使用时则用函数名+()的形式进行调用
add()#函数可以重复调用,所以这里再写一个调用也没问题,不过需要注意的是,调用语句必须在被调用函数的后面才能起作用(main情况除外)
函数与传参
def add(a,b): #在括号内定义了两个变量a,b,此时两个变量都没有赋值
c=a+b #将a,b相加的值赋值给c
print(c) #打印c的值
add(2,3) #括号内填写了2和3,调用时按照顺序分别传给a,b,即2给了a,3给了b
add(5,6) #再次调用,上次的调用时给a,b传入的值并不会影响本次值的传入(也有例外情况,不过暂时不讨论)
传参时的一些情况
情况以
def wan(a,b):
print(id(a)) #打印a的内存地址,可以发现地址和x一样
a=10 #对a重新赋值
print(id(a)) #打印a的内存地址,可以发现,不一样了
c=a+b
print(a,b,c)
print(x,y)
x=1
print(id(x)) #打印x的内存地址
y=2
wan(x,y)
情况二
a=[1,2,3]
b=[4,5]
def jia01(x,y):
print(id(x))
x.append(10)
y=[0,5,8]
print(y)
jia01(a,b)
print(id(a))
print(a)
def asd(a=[]):#可变参数不建议作为默认参数使用,因为容易造成歧义
a.append('h') #个人理解来讲,其实关键问题在关键字append这里,append的作用是像指定的内存地址中添加内容,所以在这个前提下,两次函数调用都是指向同样的内存地址,而a列表的内存在第一次调用时就添加了内容,并且没有清空,所以当第二次调用时,实质是在第一次的基础上追加信息,从而导致了两次调用后出现的值自然就不一样了
print(a)
asd()
asd()
情况三
a=3 #全局变量可以和局部变量重名
def hjk():
# print(a) #给z=5加上注释符,然后这里的注释扶如果去掉,那么显示的结果会是3
# a+=5
a=5
print("wer ",a)
hjk()
print(a)
#函数hjk和函数外都有变量a,然后函数内的变量无法被函数外调用,这种只在部分区域内能使用的变量被称为局部变量,而函数外的变量却可以在函数内被调用,这种整个程序都可被使用的变量被称为全局变量
情况四
a=[1,2,3,4]
def tgh():
a.append(10)
tgh()
print(a)
def tgh1():
a=[2,3,45] #在函数内,有等号则是重新开辟空间
tgh1()
print(a)
global
global关键字用来在函数或其他局部作用域中使用全局变量。但是如果不修改全局变量也可以不使用global关键字。
def hs1():
a=3
def hs2(x,y):
z=x+y
return z
b=4
c=hs2(a,b)
return c
print(hs1())
def cs1():
global a1
a1=19
cs1()
print(a1)
b1=3
def cs2():
global b1
b1+=4
print(b1)
cs2()
print(b1)
nonlocal
nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。
b=3
def hanshu():
a=1
b=12
def han():
nonlocal a
nonlocal b
a='d'
b='c'
print("输出a",a)
print(b)
han()
print("输出b",b)
hanshu()
print(b)
LEGB
Local 函数或本地的变量和方法名
Enclosed 嵌套函数中,相对于内层函数而言,外层函数的变量和方法名
Global 全局变量和方法名
Built-in Python默认以及内置的变量和方法名
a='allera'
b='allerb'
c='allerc'
def outer():
a='outera'
b='outerb'
def inner():
a='inner'
print('函数inner输出的a的值',a)
print('函数inner输出的b的值',b)
print('函数inner输出的c的值',c)
print(max)
inner()
outer()
匿名函数
def xx():
ln=[]
for i in range(4):
ln.append(lambda x:x*i)#这里是个匿名函数
return ln
a=xx()
print(a[0](2))
print(a[1](2))
print(a[2](2))
print(a[3](2))
以上代码等于:
def xx():
ln=[]
def x1(x):
return x*i
for i in range(4):
ln.append(x1)
print(ln)
return ln
a=xx()
print(a[0](2))
print(a[1](2))
print(a[2](2))
print(a[3](2))
作业
# 判断一个数是否是回文数。例如:输入:121,输出也是121,像这样的数就是回文数
# a=input("请输入数字")
#
# if a==a[::-1]:
# print("回文数")
# else:
# print("不是")
# 2.查找字符串中每个字符最后出现的位置。
text = """
东边来了个喇嘛,西边来了个哑巴,喇嘛手里拎着五斤挞嘛,哑巴腰里别着个喇叭,
别着喇叭的要用喇叭换手里拎着挞嘛的哑巴的挞嘛,
拎着挞嘛的哑巴不愿意用挞嘛换手里拎着喇叭的喇嘛的喇叭。
拎着喇叭的喇嘛用喇叭打了拎着挞嘛的哑巴,
拎着挞嘛的哑巴也用挞嘛打了拎着喇叭的喇嘛。
"""
b=set()
b.update(text)
for i in b:
print(i,"最后一次出现在第",text.rfind(i)+1,"位")
# 3.‘2018-11-12’去掉‘-’输出
a='2018-11-12'
b=a.split('-')
print(b)
# 4.统计数字,字母,下划线个数
a='123edfyAhjnol'
num=0
leter=0
smart=0
byt=0
for i in a:
if i.isdigit()==True:
num+=1
elif i.isupper()==True:
leter+=1
elif i.islower()==True:
smart+=1
else:
byt+=1
print(num,leter,smart,byt)