美文网首页
入门(二)函数

入门(二)函数

作者: 易路先登 | 来源:发表于2021-11-24 16:59 被阅读0次

1、内置函数

(1) help 查看函数的帮助信息

help(print)

(2)数学运算

print(abs(-5));
print(max(12,6,-5,120,74))
print(pow(2,4))

(3)类型转换

print(int('123'))
print(float('12.5'))
print(str(123))
print(bool(5))

(4)判断数据类型

a = 'abc'
print(isinstance(a,int))#第二个参数可以是元组

2 自定义函数

def 函数名(参数):
      缩进函数体

(1)默认参数

def my_pow(x,y=2)
      if y == 0:
            return 1;
      res = x
      for i in range(y - 1):
            res *= x
      return res

(2)、可变参数

def my_sum(x,*y):
      #第二个参数为一个元组
      print(x)
      print(y)
my_sum(1,2,3,4,5)#1 (2,3,4,5)
def my_sum(*y,x):
      #第二个参数为一个元组
      print(x)
      print(y)
my_sum(1,2,3,4,x=5) #(1,2,3,4) 5
def my_sum(*y,x):
      #第二个参数为一个元组
      print(x)
      print(y)
nums = [6,7,8,9]
my_sum(*nums,x=5) #(1,2,3,4) 5

(3) 关键字参数

关键字参数,使用**,也表示参数个数是可变的,但传递的是带名称的参数

def f1(x,**y):
      print(x)
      print(y)#接收到的是一个dict
f1(3,a=5,b=9,c=18)
#对于关键字参数,可以直接传入一个dict,只需要在参数前添加**
def f1(x,**y):
      print(x)
      print(y)#接收到的是一个dict
user = {'id':1001,'name':'tom','age':18}
#调用时有两种写法
f1(4,id=user['id'],name=user['name'],age=user['age'])
f1(4,**user)

(4)命名关键字参数,限制关键字参数的名字,使用分割,号后面的参数标识命名关键字参数

def f2(x,*,name,age):
      print(x)
      print(name)
      print(age)
f2(4,name='alice',age=20)

(5) 接收任意参数

def f3(*args,**kwargs):
      print(args)
      print(kwargs)
f3(1,43,'aaa',name='alice',age=20)

(6) 空函数

# 表示以后再实现
def empty():
      pass

2 函数的返回值

(1)、多个返回值

#函数有且只能有一个返回值,如果返回多个,会被视作一个元组
def f4():
      return 'tom'
def f5():
      name = 'tom'
      age = 20
      sex = 'male'
      return name,age,sex
a,b,c = f5()
print(a,b,c)

(2) 闭包

#内部函数使用了外部函数的参数或局部变量,成为闭包
def f6(x):
      z = 6
      def f7(y):
            print(x*y)
      return f3
fn = f6(3)
fn(5)

(3)递归函数:一个函数再内部调用自身,这个函数就是递归函数

def calc(x,y):
      i = 1
      res = x
      while i < y:
             res *= x
             i += 1
      return res
calc(x,3)
#递归写法
def calc(x,y):
      if y == 0;
          return 1
      else:
          return calc(x,y-1)

(4)变量作用域和命名空间

'''
变量作用域scope:指的是变量生效的区域
两种作用域:
1、全局作用域
      函数以外的区域都是全局作用域
      在全局作用域中定义的变量,都是全局变量
2、函数作用域,也成为局部作用域
      函数内的区域
'''
a = 5 #全局变量
#python没有块级作用域
#如果希望在函数中修改全局变量,要使用global关键字来声明变量
def fn():
      global a
      a = 10
fn()
print('函数外部:a=',a)
'''
命名空间namespace:指的是变量存储的位置,每一个变量都要存储在指定的命名空间中,每个作用域都有一个对应的命名空间。
'''
  • 操作scope
scope = locals()
print(scope)
print(type(scope))
#可以通过scope['name']的方式获取变量值,但不建议设置未声明变量的值(而且函数作用域中不可以通过作用域声明变量)
# 可以通过globals()在任意位置获取全局命名空间(在函数中也可以)
  • 迭代
#迭代:也成为遍历,循环获取每一个元素
for i in ['tom','jack','alice']:
     print(i,end='  ')
print()
for i in ('tom','jack','alice'):
    print(i,end='  ')
print()

for k,v in {'name':'tom','age':18,'sex':'male'}.items():
    print(k,v)

for i in 'hello':
  print(i)
  • 判断一个数据是否可迭代
import collections
print(isinstance('hello',collections.Iterable))
  • 介绍两种数组的迭代方法
# 方式1:自己获取索引
names = ['tom','jack','alice']
for i in range(len(names)):
      print(i,names[i])
#方式2:使用enumerate()函数,转换为索引-元素对
for k,v in enumerate(names):
      print(k,v)
  • 列表生成器
nums = list(range(0,100))
  • 生成一个包含[1,100]之间所有3的倍数的list
#方式1
lst = []
for i in range(1,101):
     if i%3 == 0:
        lst.append(i)
#方式2
lst = [i for i in range(1,101) if i%3 == 0]

(5)迭代器和生成器
迭代器

nums = [1,2,3,4,5,6]
it = iter(nums)#调用iter()函数创建迭代器
next(it)#调用next()函数获取迭代器的下一个元素,它只能往前,不能往后

使用for in遍历迭代器

nums = [1, 2, 3, 4, 5, 6]
it = iter(nums)  #调用iter()函数创建迭代器
for i in it:
    print(i)

生成器
生成器并不会立即在内存中开辟空间存储数据,只有你调用next方法时才会生成这个数据

generator = (i for i in range(1,100))
print(next(generator))

在函数中使用yield关键字,该函数就变成一个生成器函数

def gen():
    yield 13
    yield 14

3、高阶函数

高阶函数: 一个函数接收另一个函数作为参数,这种函数称为高阶函数
(1)、自定义高阶函数

def fil(x):
    return x > 5


def fn(fun, lst):
    new_list = []
    for i in lst:
        if fun(i):
            new_list.append(i)
    return new_list


print(fn(fil, [2, 3, 5, 8, 9]))

(2)、内置高阶函数

  • filter
def fil(x):
    return x > 5


nums = [3, 6, 8, 9, 4]
print(list(filter(fil, nums)))
  • map
def fil(x):
    return x + 5


nums = [3, 6, 8, 9, 4]
print(list(map(fil, nums)))
  • sorted
def fil(x):
    return x + 5


nums = [3, -6, 8, -9, 4]
print(list(sorted(nums, key=abs)))

4 匿名函数

nums = [3, -6, 8, -9, 4]
print(list(map(lambda x: x*2, nums)))
#不建议将匿名函数赋值给变量

5 装饰器

在代码运行期间动态增加功能,称为装饰器

def log(fn):
    def wrapper(*args, **kwargs):
        print('开始执行%s()函数' % fn.__name__)
        res = fn(*args, **kwargs)
        print('%s()函数执行结束' % fn.__name__)
        return res

    return wrapper


@log
def con(num):
    print(num)
    return num


con(5)

相关文章

网友评论

      本文标题:入门(二)函数

      本文链接:https://www.haomeiwen.com/subject/brbstrtx.html