python3 函数参数局部变量

一.函数参数

1.函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码块。高复用,低耦合。

2.语法:

def 函数名(参数列表):

    函数体

    return xxx

可以返回多个值,返回的多个值组成一个元组,返回值加上一对中括号,则返回一个列表。

函数分为定义和调用

3.可更改(mutable)与不可更改(immutable)对象

    string、tuples、numbers是不可更改对象

    list、dict等是可以修改的对象

  3.1.传递不可变类型:值传递(复制副本),如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部    修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。

  3.2.传递可变类型:引用传递,值传递传递的数据类型是 可变类型用值传递传递方式(复制内存地址的副本)去传递 可变类型-可改变内容 不可改变原地址如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la的内容也会受影响

4.调用函数时可使用的正式参数类型:

必选参数:(形参和实参一一对应,个数、数据类型、顺序)、

默认参数:(缺省参数)、缺省参数必须写在后面,可以不指定参数名,但是顺序要保证,否则要指定参数名、

可变参数:*args(不定长参数,允许传入0个或任意多个参数,这些可变参数在函数调用时自动组装为一个tuple)、

关键字参数:**kw(name=value允许传入0个或任意多个参数名的参数,这些关键字参数在函数内部自动组装成一个dict)、

参数组合:

参数定义的顺序必须是:必选参数、默认参数、可变参数、关键字参数

def f1(a, b, c=0, *args, **kw):
 print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
f1(1,2,3,4,5,6,w=7,q=8)

运行结果

a = 1 b = 2 c = 3 args = (4, 5, 6) kw = {'w': 7, 'q': 8}

def f2(a, b, c=0, *, d, **kw):
 print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
f2(1,2,(3,4,5),d=4)

运行结果

a = 1 b = 2 c = (3, 4, 5) d = 4 kw = {}
def f3(a, b, c=0, *arags, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
t=(1,2,3,4,5)
f3(*t,d=9)
运行结果
a = 1 b = 2 c = 3 d = 9 kw = {}

二.变量作用域:

分为全局变量和局部变量:

g_a = 20
def testl():
    a = 10
    global g_a  #声明调用的是 全局变量
    g_a = g_a+a
    print(a)
testl()
print(g_a)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
10
30

全局变量和局部变量重名时,局部变量优先

c_m=10
def show():
    c_m=30 #就近一致
    print(c_m)
show()
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
30

即:局部变量特点===形参

三.匿名函数

语法lambda [参数列表]:函数体内部代码
lam = lambda : print('this is a lambda')

lam()    #():来调用/执行

案例:加法

def Youfun(x,y,fun):
    print(fun(x,y))
def myfun(x,y):
    return  x+y
Youfun(10,20,myfun)
#  更简单:
Youfun(20,30,lambda x,y:x+y)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
30
50

Process finished with exit code 0

循环输出

wu = lambda x:[print(i) for i in range(x)]
wu(9)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
0
1
2
3
4
5
6
7
8

Process finished with exit code 0

定义函数

(普通方式)
def func(arg):
    return arg + 1
执行函数
result = func(123)
(lambda表达式)
my_lambda --》 lambda arg : arg + 1
执行函数
result = my_lambda(123)

四.大数据用到的函数:

python map()#逐个匹配 接收两个参数,一个是函数,
一个是序列map将序列的每个元素传入函数中执行,并把结果作为新的map返回。

yu = list(map(lambda x:x+1,range(10)))
print(yu)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Process finished with exit code 0

filter:过滤 即:筛选

案例:筛选偶数

list2 = [1,4,6,7,9,12,17]
filterl = list(filter(lambda x:x%2==0,list2))
print(type(filterl))
print(filterl)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
<class 'list'>
[4, 6, 12]

Process finished with exit code 0

利于filter(),可以完成很多有用的功能,例如 删除 None 或者空字符串

strs = [None,'','','df','丫丫','啦啦']
''''
过程:
def isNone(s):
    return s and len(s.strip())>0
'''
strsl = list(filter(lambda s:s and len(s.strip())>0,strs))
print(strsl)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
['df', '丫丫', '啦啦']

Process finished with exit code 0

利用filter()过滤出1-100的平方根是整数的数

import  math
filter1 = list(filter(lambda x:math.sqrt(x)%1==0,range(1,101)))
print(filter1)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Process finished with exit code 0

 reduce:求和 即:# 接收的参数和 map()类似

import math,functools as f
li=[11,22,33,44,55]
red= f.reduce(lambda x,y:x+y,li,)
print(red)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
165

Process finished with exit code 0

python内置求和函数:sum

print(sum(li))

把值变成负数
import math,functools as f
li=[11,22,33,44,55]
red= f.reduce(lambda x,y:x-y,li,0)
print(red)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
-165

Process finished with exit code 0

自定义排序:复制数据不改变原数据 只从新排序

r = [1,5,2,8,3,9,4]
new_r = sorted(r)#默认升序
print(new_r)
print(r)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
[1, 2, 3, 4, 5, 8, 9]
[1, 5, 2, 8, 3, 9, 4]

Process finished with exit code 0

r = [1,5,2,8,3,9,4]
new_r = sorted(r,reverse=True)#降序
print(new_r)
print(r)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
[9, 8, 5, 4, 3, 2, 1]
[1, 5, 2, 8, 3, 9, 4]

Process finished with exit code 0
L = [('DFG', 75), ('ADF', 92), ('Bart', 66), ('Lisa', 88)]
n_l = sorted(L)
print(n_l)
#排序列表,是以ASCII码比较
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
[('ADF', 92), ('Bart', 66), ('DFG', 75), ('Lisa', 88)]

Process finished with exit code 0
L = [('55', 75), ('44', 92), ('Bart', 66), ('Lisa', 88)]
#这个时候就得用指定key的方式排序:
n_l = sorted(L,key=lambda x:x[1],)
print(n_l)
/Users/liuqian/venv/learn/bin/python /Users/liuqian/PycharmProjects/learn/面向对象/函数.py
[('Bart', 66), ('55', 75), ('Lisa', 88), ('44', 92)]

Process finished with exit code 0










猜你喜欢

转载自blog.csdn.net/lqian1993/article/details/80374803