函数的参数与全局局部作用域

函数参数的传递

传递方式:#给的过程
位置传参
  序列传参
关键字传参
  字典关键字传参


位置传参

实际参数(实参)的对应关系与形式参数(形参)的对应关系是按位置来依次对应的

示意图:
def mymin(a, b, c):
  pass

mymin( 1, 2, 3)
例见:

1 #此事例示意位置传参, 此函数以后不会改变代码
2 def myfun(a, b, c):
3     print("a 的值:", a)
4     print("b 的值:", b)
5     print("c 的值:", c)
6     
7 myfun(1, 2, 3)
位置传参

说明:
实参和形参通过位置进行传递和匹配
实际参数的个数必须与形参的个数相同

序列传参

序列传参是指函数调用过程中用"*"将序列拆解后按位置进行传递的传参方式

说明:
序列传参时, 序列按拆解的位置将与形参一一对应
序列的位置信息对应相应的形参位置

例:

 1 def myfun(a,b,c):
 2    """此函数不会变化"""
 3 print("a=",a)
 4 print("b=",b)
 5 print("c=",c)
 6 s="ABC" 参数个数要和(a,b,c)个数相同
 7 l=[4,5,6]
 8 t=(1.1,2.2,3.3)
 9 #myfun(s[0],s[1],s[2]) 按位置传参
10 myfun(*s)
11 myfun(*l)
12 myfun(*t)
序列传参
 1 #序列传参
 2 def myfun1(a, b, c):
 3     print("a 的值:", a)
 4     print("b 的值:", b)
 5     print("c 的值:", c)
 6 
 7 
 8 s1 = [11, 22, 33]
 9 # myfun1(s1) 错
10 myfun1(s1[0], s1[1], s1[2])
11 myfun1(*s1)#相当于拆myfun1(11, 22, 33)
12 t1 = (44, 55, 66)#元组
13 myfun1(*t1)
14 myfun1(*'ABC')
序列传参

关键字传参

关键字传参是指传参时,按着形参的"名称"给形参赋值
实参与形参按形参名进行匹配

例:
def myfun(a,b,c):
   """此函数不会变化"""
print("a=",a)
print("b=",b)
print("c=",c)

myfun(b=2,c=3,a=1)
myfun(c=333,b=222,a=111)

1 #关键字传参
2 def myfun1(a, b, c):
3     print("a 的值:", a)
4     print("b 的值:", b)
5     print("c 的值:", c)
6 
7 myfun1(b=22, c=33, a=11)#
8 myfun1(c=66, b=555, a=444)
关键字传参

字典关键字传参

是指实参为字典, 将字典用"**"拆解后进行关键字传参方法

例:
示例:
def myfun(a,b,c):
"""此函数不会变化"""
print("a=",a)
print("b=",b)
print("c=",c)

d={'a':111,'c':333,'b':22}
myfun(**d) # 等同于myfun(a=111,c=333,b=222)

>>> def myfun(a,b,c):
... """此函数不会变化"""
... print("a=",a)
... print("b=",b)
... print("c=",c)
...
>>> d={'a':111,'c':333,'b':22}
>>> myfun(**d)
a= 111
b= 22
c= 333

说明:
字典的键名和形参名必须一致
字典的键名必须为字符串(且必须为标识符的规则)
字典的键名要在形参中存在

>>> def myfun1(a, b, c):
... print("a 的值:", a)
... print("b 的值:", b)
... print("c 的值:", c)
...
>>> myfun1(100, c=300, b=200)
a 的值: 100
b 的值: 200
c 的值: 300
>>>
>>>
>>> print(1, 2, 3, 4, sep="#")
1#2#3#4


函数的综合传参:
函数的传参方式在能确定形参能唯一匹配到相应实参的情况下可以任意组合

说明:
位置传参(序列传参)要在关键字传参(字典关键字传参)的左侧

例:

1 #关键字传参
2 def myfun1(a, b, c):
3     print("a 的值:", a)
4     print("b 的值:", b)
5     print("c 的值:", c)
6 
7 myfun1(b=22, c=33, a=11)#
8 myfun1(c=66, b=555, a=444)
字典关键字传参

#当调用时
myfun1(100, *[200, 300])
myfun1(*(100, 200), 300)
myfun1(*[100], 200, *(300,))
myfun1(100, c=300, b=200)#正确
myfun1(c=300, b=200, 100)#错误
myfun1(100, **['c':300, 'b':200])


练习:
写一个函数minmax(a, b, c) 有三个参数, 这回这三个参数中的最小和最大值,
要求, 形成元组, 最小值在前, 最大值在后, 如:
def minmax(a, b, c):
...
t = minmax(11, 33, 22)
print(t)#{11, 33}
xiao, da = mimmax(6, 5, 4)
print('最大值:', da, '最小值:', xiao)

 1 def minmax(a, b, c):
 2     da = max(a, b, c)
 3     xiao = min(a, b, c)
 4     return(xiao, da)
 5     
 6 t = minmax(11, 33, 22)
 7 print(t)#(11, 33)
 8 xiao, da = minmax(6, 5, 4)
 9 print('最大值:', da, '最小值:', xiao)
10 
11 
12 def minmax(a, b, c):
13     zuida = a
14     if b > zuida:
15         zuida = b
16     if c > zuida :
17         zuida = c
18 
19     zuixiao = a
20     if b < zuixiao:
21         zuixiao = b
22     if c < zuixiao:
23         zuixiao = c
24     return (zuixiao, zuida)
25       
26 t = minmax(1, 2, 3)
27 rint(t)#(11, 33)
28 xiao, da = minmax(6, 5, 4)
29 print('最大值:', da, '最小值:', xiao)
minmax

缺省参数

函数形参的定义
函数形参的定义
函数的缺省参数:
语句:
def 函数名(形参名=默认实参1, 形参名2=默认实参2, ...):
语句块

例:

1 def info(name, age=1, address='未填写'):
2     print('我叫', name, '我今年', age, '岁, 我家住址:', address)
3 
4 info("宋梓鸿", 20, '广东梅州')
5 info('tarena', 15)
6 info('张飞')
7 # info()#不可以
8 info('小张', age=20)
缺省参数

说明:
缺省参数必须自右至左依次存在, 如果一个参数有缺省参数, 则其右侧的所有参数都必须有缺省参数

如:
def fe (a, b=10, c)#错误
pass
def fe(a=1, b=5, c=10):
pass

fe(100, c=300)#(a=100, b=5, c=300)


练习:
myadd

print_odd
# 练习:
#  写一个函数 myadd,此函数可以计算两个数的和,也可以计算三个数的和

# def myadd(a,b,c=0):
# # return a+b+c
# return sum((a,b,c))

# print(myadd(10,20)) # 30
# print(myadd(100,200,300)) # 600
# 用sum怎么做?sum用于可迭代对象

1 def myadd(a, b=0, c=0):
2     s = a + b + c
3     return(s)
4 print(myadd(50))
5 print(myadd(10, 20))
6 print(myadd(100, 200, 300))
myadd


# 2.写一个函数,print_odd,此函数可以传递一个实参,也可以传递两个,
当传递一个实参时,代表结束值,当传递两个实参时,第一个实参代表
起始值,第二个实参代表结束值
打印出在此区间内的全部奇数,不包含结束数:

 1 def print_odd(a,b=0):
 2     if b == 0:
 3         for x in range(1,a,2):
 4             print(x,end=' ')
 5         else:
 6             print()
 7     else:
 8         if a % 2 == 0:
 9             a += 1
10         for x in range(a,b,2):
11             print(x,end=' ')
12         else:
13             print()
14 -------------------------
15 def print_odd(a,b=0):
16     if b ==0:
17         b = a
18         a = 0
19     while a < b:
20         if a % 2 ==1:
21             print(a,end=' ')
22             a += 2
23         else:
24             a +=1
25     print()
26 ----------------------------
27 def print_odd(a,b=None):
28     if b is None:
29         start = 1
30         end = a
31     else:
32         start = a
33         end = b
34     #如果开始是偶数,做校正
35     if start % 2 ==0:
36         start += 1
37     for x in range(start,end,2):
38         print(x,end=' ')
39     print()
40 
41 print_odd(10) # 1,3,5,7,9
42 print_odd(11,20) # 11,13,15,17,19
43 print_odd(30,40)
44 print_odd(5,0)
print_odd
 1 def print_odd(a, b = 0):
 2     if b == 0:
 3         l = []
 4         for x in range(0, a):
 5             if x % 2 == 1:
 6                 l +=[x]
 7     else:
 8         l = []
 9         for i in range(a, b):
10             if i % 2 ==1:
11                 l +=[i]
12     print(l)       
13 
14 print_odd(10)
15 print_odd(11, 20)
16 
17 
18 def print_odd(a, b = 0):
19     if b == 0:
20         for x in range(1, a, 2):
21             print(x, end= ' ')
22         else:
23             print()
24     else:
25         if a % 2 == 0:#如果是奇数
26             a +=1
27         for x in range(a, b, 2):
28             print(x, end=' ')
29         else:
30             print()
31 print_odd(10)
32 print_odd(11, 20)
33 print_odd(5, 0)
34 
35 def print_odd(a, b = None):
36     if b is None:
37         start = 1
38         end = a 
39     else:
40         start = a
41         end = b
42     #如果开始的偶数, 做校正
43     if start % 2 == 0:
44         start += 1
45     for x in range(start, end, 2):
46         print(x, end=' ')
47     print()
48 
49 print_odd(10)
50 print_odd(11, 20)
51 print_odd(5, 0)
print_odd

函数形参的定义方式

#拿的过程
1.位置形参
2.星号元组形参
3.命名关键字形参
4. 双星号字典形参

位置形参

语法:
def 函数名(形参名1, 形参名2,...):
语句块

星号元组形参

语法:
def 函数名(*元组形参名):
语句块

作用:
收集多余的位置传参

示例:
def fa(a,b,c): # 最多只能传递三个实参
pass

def fb(*args):
'''args绑定一个元组'''
print("实参的个数是:",len(args))
print("args=",args)

fb()
fb(1,2,3,4) 实参个数是:4 args=(1,2,3,4)

1 # 星号元组形参
2 def func(*ages):
3     print('参数的个数是:', len(ages))
4     print('ages',ages)
5 
6 func()#无参
7 func(1, 2, 3,4 )
8 func(*"ABC", 1, 2, 3, None, False)
星号元组形参
1 def fa (a, b, *args):
2     print(a)
3     print(b)
4     print(args)
5 
6 fa(1, 2, 3, 4, 5, 6,7 ,8 9)
星号元组形参

练习:
写一个函数, mysum可以传入任意个实参的数字, 返回所有实参的和
def mysum(*args):
...
print(mysum(1, 2, 3, 4))#10
print(mysum(10, 20, 30))#60

1 def mysum(*args):
2     s = 0
3     for x in args:
4         s +=x
5     return s
6 
7 print(mysum(1, 2, 3, 4))
8 print(mysum(10, 20, 30))
mysum

命名关键字形参

语法:
def 函数名(*, 命名关键字形参):
语句块

def 函数名(*aegs, 命名关键字形参(传参)):

例;
1. print(1, 2, 3, 4, sep="#")
2. l = [2, 4, 6, 8, 10]
sorted(l, reverse=True)


作用:
强制所有的参数都必须用关键字传参或字典关键字传参
>>> print(1, 2, 3, 4, sep="#")
1#2#3#4
>>> p = ['1', '2', '3']
>>> '#'.join(p)
'1#2#3'

1 # 命名关键字形参
2 def fa(*, a, b):
3     print('a=', a)
4     print('b=', b)
5 
6 fa(b=1, a=2)
7 
8 fa(**{'b': 200, 'a': 100})#关键字传参,明确参数的含义reverse
命名关键字形参
1 def fb(*args, a, b):
2     print('a=', a)
3     print('b=', b)
4     print("args=", args)
5 
6 fb(1, 2, 3, 4, b=200, a=100)
命名关键字形参


双星号字典形参

语法:
def 函数名(**字典形参名):
语句块


作用:
收集多余的关键字传参
说明:
字典形参名通常命名为'kwargs'


>>> dict (a=100, b=200)
{'b': 200, 'a': 100}

>>> max([7, 5, 3, 9, 3])
9
#一个实参
>>> max(5,4,8)
8
#三个实参
>>> max(9)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
#一个错实参

1 def fa(**kwargs):
2     print("调用时关键字传参的个数是:", len(kwargs))
3     print('kwargs', kwargs)
4 fa(name='tarena', age=15)
5 fa(a=1, b='BBB', c=[2, 3, 4], d=True)
双星号字典形参


练习:
写一个函数,mymax类似于内键的函数max
详见:
>>> help(max)

仿照 max 写一个mymax函数, 功能与max完全相同(要求不允许调用max函数)
print(mymax([6, 8, 3, 5]))#8
print(mymax(100, 200))#200
print(mymax(1, 3, 5, 9, 7))#9

 1 def mymax(a, *args):
 2     if len(args)==0:
 3         zuida = a[0]
 4         for x in a:
 5             if x > zuida:
 6                 zuida = x
 7         return zuida
 8     else:#实参个数大于1时
 9         zuida = a
10         for x in args:
11             if x > zuida:
12                 zuida = x
13 
14         return zuida
15 
16 print(mymax([6, 8, 3, 5]))#8
17 print(mymax(100, 200))#200
18 print(mymax(1, 3, 5, 9, 7))#9
Mymax


实参是给 形参是接(拿)
  函数的参数说明:
位置形参, 缺省形参, 星号元组形参, 双星号字典形参可以混合使用

函数形参自左至右的顺序为:
位置形参
星号形参
命名关键字形参
双星号字典形参

例: 可以*
def fx(a, b, *args, c, **kwargs):
  print(fx)
fx(1, 2, 3, 4, c="C", d="D", e="E")

函数的不定长参数:
 星号元组形参,双星号字典形参

说明:
 可以接收任意的位置传参和关键字传参

示例:
def fn(*args,**kwargs):
  pass

fn(1,2,3,4,a=100,b=200,c=300)
fn()
fn(1,2,3)


查看 >>>help(print) 猜想print函数的参数列表是如何定义的?

def print(*args,sep=' ',end=' ',file=sys.stdout,flush=False):
  pass

print(1,2,3,4,end=' ',sep='#')

全局变量和局部变量

局部变量:local varible
1.定义在函数内部的变量称为局部变量(函数的形参也是局部变量)
2.局部变量只能在函数内部使用
3.局部变量只有在函数调用时才能被创建, 在函数调用结束后会自动销毁

全局变量 global variable
定义在函数外部,模块内部的变量称为全局变量
全局变量所有函数都可以直接访问(但函数内不能将其直接赋值)
示例

 1 a = 100
 2 b = 200
 3 def fx(c):
 4     d = 400
 5     a = 100000
 6     print(a, b, c, d)
 7 
 8 fx(300)
 9 print("全局内的",a, b, c, d)
10 # fx, a, b 为全局变量  c, d 局部变量
全局局部

练习:
创建一个全局变量 L= []
写一个函数:
def input_number():
...
此函数每次调用将从键盘读入一些数追加到列表L中
如:
L = []
def input_number():
...
input_number()
print(L)#[..........这些是您从键盘输入的数...]

 1 L = []
 2 def input_number():
 3     while True:
 4         x = int(input("qingshuru, 按0退出:"))
 5         if x == 0:
 6             break
 7         L.append(x)
 8     return(L)
 9 
10 
11 input_number()
12 print(L)
input_number


>>> L(变量) = [1, 2, 3](对象)
>>>
>>> def fx(n):
...   L.append(n)
...   L = [n]

 

练习:
1.写一个函数isprime(x)判断x是否为素数。如果是素数, 返回True, 否则返回False

 1 def isprime(x):
 2     if x < 2:
 3         print(True) 
 4 
 5     else:
 6         for i in range(2, x):
 7             if x % i == 0:
 8                 print(False)
 9                 break
10         else:
11             print(True)
12 
13 isprime(10)
14 isprime(11)
15 isprime(6523166)
16 isprime(11111)
isprime

2.写一个函数prime_m2n(m,n)返回从m 开始, 到n结束(不包含n)范围内的素数, 返回这些素数的列表并打印
如:L = prime_m2n(5, 10)
print(L) [5, 7]

 1 def prime_m2n(m, n):
 2     L = []
 3     for x in range(m, n):
 4         if x < 2:
 5             continue
 6         else:
 7             for i in range(2, x):
 8                 if x % i == 0:
 9                     break
10             else:
11                 L +=[x]
12     return L
13 
14 L = prime_m2n(5, 10)
15 print(L)  
16 
17 L = prime_m2n(0, 20)
18 print(L)
prime_m2n


3.写一个函数pimes(n)返回小于n的全部素数的列表, 并打印这些素数
如:

L = primes(10)
  print(L)
#[2,, 3, 5, 7]
1) 打印100以内的全部素数
2)打印200以内的全部素数的和

 1 def primes(n):
 2     L = []
 3     for x in range(n):
 4         if x >= 2:
 5             for h in range(2, x):
 6                 if x % h == 0:
 7                     break
 8             else:
 9                 L.append(x)
10     print(L)
11     print(sum(L))
12 
13 L = primes(100)
14 L = primes(200)
primes

4.编写函数fn()此函数返回下列级数的和
fn(n) = 1/(1*2) + 1/(2*3) +...+1/(n*(n-1))的和

print(fn(100))

1 def fn(n):
2     l = []
3     for x in range(1, n):
4         s = 1/(x*(x+1))
5         l.append(s)
6     he = sum(l)
7     return he
8 print(fn(100))
fn
原文地址:https://www.cnblogs.com/Alan-Song/p/9658408.html