入门(二)函数

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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容