Python函数基础(定义函数、函数参数、匿名函数)

目录
  • 一、定义函数:
    • 1、简单的规则:
    • 2、语法
    • 3、无参函数
    • 4、有参函数
    • 5、空函数
  • 二、调用函数及返回值
    • 1、函数运行完毕所有代码,如果函数体不写return,则会返回None。
    • 2、函数可以返回一个或多个值(元组类型)
  • 三、函数的参数
    • 1、普通参数,位置必需参数
    • 2、关键字参数
    • 3、默认参数
    • 4、不定长参数之*
      • 注意:实参之*
    • 5、不定长参数之**
      • 注意:实参之**
      • 可变长参数应用
    • 6、命名关键字参数
  • 四、函数对象
    • 1、函数当作参数传给一个另一函数
    • 2、函数当作另一函数的返回值
    • 3、函数可以当作容器类型的元素
  • 五、函数递归
  • 六、匿名函数:
    • 1、语法
    • 2、与内置函数联用
      • 1.max()
      • 2.sorted()
      • 3.map()
      • 4.filter()
  • 七、内置函数
    • 1.bytes():解码字符。
    • 2.chr()/ord():chr()参考ASCII码表将数字转成对应字符;ord()将字符转换成对应的数字。
    • 3.divmod():分栏。
    • 4.enumerate():带有索引的迭代。
    • 5.eval():把字符串翻译成数据类型。
    • 6.hash():是否可哈希。
    • 7.abs():求绝对值。
    • 8.all():可迭代对象内元素全为真,则返回真。
    • 9.any():可迭代对象中有一元素为真,则为真。
    • 10.bin()/oct()/hex():二进制、八进制、十六进制转换。
    • 11.dir():列举出所有time的功能。
    • 12.frozenset():不可变集合。
    • 13.globals()/loacals():查看全局名字;查看局部名字。
    • 14.pow():
    • 15.round():
    • 16.slice():
    • 17.sum():
    • 18.__import__():通过字符串导入模块。
    • 19. 面向对象知识点

函数先定义函数,后调用

一、定义函数:

1、简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

2、语法

Python 定义函数使用 def 关键字

默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。

def 函数名(param1,param2……):
"""
函数功能的描述信息
:param1:描述
:param2:描述
:return:返回值
"""
code
...
return 返回值

3、无参函数

def register():
    """注册功能"""
    username = input('username: ').strip()
    pwd = input('password: ').strip()

    with open('32.txt', 'a', encoding='utf8') as fa:
        fa.write(f"{username}:{pwd}\n")
        fa.flush()

4、有参函数

def sum_self(x, y):
    """求和"""
    res = x+y
    print(res)

sum_self(1,2)  # 3

5、空函数

你只知道你需要实现某个功能,但不知道该如何用代码实现时,你可以暂时写个空函数

def func():
    pass

二、调用函数及返回值

定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。

函数名(param1、param2……)

如:

register()

1、函数运行完毕所有代码,如果函数体不写return,则会返回None。

def foo():
    pass

print(foo()) #None

2、函数可以返回一个或多个值(元组类型)

def func():
    name = 'nick'
    age = 19
    hobby_list = ['read', 'run']
    return name, age, hobby_list

name, age, hobby_list = func()
print(name,age,hobby_list) #('nick', 19, ['read', 'run'])

三、函数的参数

1、普通参数,位置必需参数

在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置形参。

特点:按照位置定义的形参,都必须被传值,多一个不行,少一个也不行。

def func(x, y):
    print(x)
    print(y)

在函数调用阶段,按照从左到右的顺序依次定义的实参,称之为位置实参。

特点:按照位置为对应的形参依次传值。

func(1, 2)

2、关键字参数

在调用函数时,按照key=value的形式为指定的参数传值,称为关键字实参。

特点:可以打破位置的限制,但仍能为指定的形参赋值。

func(y=2, x=1)
  • 可以混用位置实参和关键字实参,但是位置实参必须在关键字实参的左边。
  • 可以混用位置实参和关键字实参,但不能对一个形参重复赋值。
func(x, y=2)
func(y=2, x)  # SyntaxError: positional argument follows keyword argument
func(x, x=1)  # NameError: name 'x' is not defined

3、默认参数

在定义阶段,就已经被赋值。意味着在调用时可以不用为其赋值。位置形参必须放在默认形参的左边。

def func(x, y=10):
    print(x)
    print(y)

func(2)

默认形参的值只在定义阶段赋值一次,也就是说默认参数的值在函数定义阶段就已经固定了。

m = 10

def foo(x=m):
    print(x)

m = 111
foo()  # 10

默认参数的值通常应该是不可变类型。

def register(name, hobby, hobby_list=None):
    hobby_list = [hobby]
    print(f"{name} prefer {hobby_list}")

register('nick', 'read')  # ['read']
register('tank', 'zuipao')  # [ 'zuipao']
register('jason', 'piao')  # ['piao']

# 演示形参是可变类型,(列表是可变类型)
def register(name, hobby, hobby_list=None):
    hobby_list = [hobby]
    print(f"{name} prefer {hobby_list}")

register('nick', 'read')  # nick prefer ['read']
register('tank', 'zuipao')  # tank prefer ['zuipao']
register('jason', 'piao')  # jason prefer ['piao']o']

4、不定长参数之*

形参中的*会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给*后的参数。需要注意的是:*后的参数名约定俗成为args。

def sum_self( *args):
    res = 0
    for num in args:
        res += num
    return res

res = sum_self(1, 2, 3, 4)
print(res)  # 10

注意:实参之*

实参中的*,*会将*后参数的值循环取出,打散成位置实参。以后但凡碰到实参中带*的,它就是位置实参,应该马上打散成位置实参去看。

def func(x, y, z, *args):
    print(x, y, z, args)

func(1, *(1, 2) , 3, 4)  # 1 1 2 (3, 4)

5、不定长参数之**

形参中的**会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给**后的参数。需要注意的是:**后的参数名约定俗成为kwargs。

def func( **kwargw):
    print(kwargw)

func(a=5,b=3)  # {'a': 5, 'b': 3}

注意:实参之**

实参中的**,**会将**后参数的值循环取出,打散成关键字实参。以后但凡碰到实参中带**的,它就是关键字实参,应该马上打散成关键字实参去看。

def func(x, y, z, **kwargs):
    print(x, y, z, kwargs)

func(1, 3, 4, **{'a': 1, 'b': 2} )  # 1 3 4 {'a': 1, 'b': 2}

可变长参数应用

def index(name, age, sex):
    print(f"name: {name}, age: {age}, sex: {sex}")  # name: nick, age: 19, sex: male

def wrapper(*args, **kwargs):
    print(f"args: {args}")  # args: ()
    print(f"kwargs: {kwargs}")  # kwargs: {'name': 'nick', 'sex': 'male', 'age': 19}
    index( *args, **kwargs)

wrapper(name='nick', sex='male', age=19)

6、命名关键字参数

命名关键字则是在「位置参数」和「命名关键字参数」中使用,*,隔开,后面的即为命名关键字。* 后的参数必须用关键字传入。

def student(name, age, *, city, gender):
    print(name, age, city, gender)

student('xiaoming', 6, city='beijing', gender='male')  # xiaoming 6 beijing male
student('xiaoming', 6, 'beijing', 'male') #TypeError: student() takes 2 positional arguments but 4 were given

特点:在传值时,必须按照key=value的方式传值,并且key必须命名关键字参数的指定的参数名。

def register(x, y, *, name, gender='male', age):
    print(x)
    print(name)
    print(age)

register(1, 2, name1='nick', age=19)  # TypeError: register() got an unexpected keyword argument 'name1'

Python3.8 新增了一个函数形参语法, “/” 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。

在以下的例子中,形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 或 f 要求为关键字形参:

def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

以下使用方法是正确的:

f(10, 20, 30, d=40, e=50, f=60)

四、函数对象

函数是第一类对象,即函数可以被当做数据处理。

def func():
    print('from func')

print(func)  #

1、函数当作参数传给一个另一函数

def func():
    print('from func')

def foo(m):
    m()

foo(func)  # from func

2、函数当作另一函数的返回值

def func():
    print('from func')

def foo(x):
    return x

res = foo(func)
print(res)  #

3、函数可以当作容器类型的元素

def func():
    print('from func')

function_list = [func]
function_list[0]()  # from func

五、函数递归

递归的精髓在于通过不断地重复逼近一个最终的结果。

age(1)=26,age(n)=age(n-1)+2 ,求age(5)的值:

'''
...
age(5) = age(4) + 2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 26

age(n) = age(n-1) +2
age(1) = 26  # n=1
'''

def age(n):
    if n == 1:
        return 26
    res = age(n-1) + 2
    return res

print(f"age(5): {age(5)}")

递归的本质就是干重复的活。

lis = [1, [2, [3, [4, [5, [6, ]]]]]]

def tell(lis):
    for i in lis:
        if type(i) is list:
            tell(i)
        else:
            print(i)

tell(lis)

二分法的思想实现查找数字。

from random import randint

nums = [randint(1, 100) for i in range(100)]
nums = sorted(nums)

def search(search_num, nums):
    print(nums)
    mid_index = len(nums) // 2
    if not nums:
        print('not exists')
        return
    if search_num > nums[mid_index]:
        # in the right
        nums = nums[mid_index + 1:]
        search(search_num, nums)
    elif search_num < nums[mid_index]:
        # in the left
        nums = nums[:mid_index]
        search(search_num, nums)
    else:
        print('find it')

search(7, nums)

六、匿名函数:

python 使用 lambda 来创建匿名函数。

所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

1、语法

lamdbda 参数 : 逻辑代码

# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2

# 调用sum函数
print ("相加后的值为 : ", sum( 10, 20 ))
print ("相加后的值为 : ", sum( 20, 20 ))

匿名函数,他没有绑定名字,使用一次即被收回,加括号既可以运行。

print(lambda x, y: x + y )  # (x, y)>
res = (lambda x, y: x + y)(1, 2)
print(res)  # 3

lambda 匿名函数也是可以使用"关键字参数"进行参数传递,也可以设定默认值。

g = lambda x=0, y=0: x ** 2 + y ** 2
print(g(2, 3))
# 13
print(g(2))
# 4
print(g(y=3))
# 9

2、与内置函数联用

匿名函数通常与max()、sorted()、filter()、sorted()方法联用。

1.max()

如果我们想从上述字典中取出薪资最高的人,我们可以使用max()方法,但是max()默认比较的是字典的key。

  • 首先将可迭代对象变成迭代器对象
  • res=next(迭代器对象),将res当做参数传给key指定的函数,然后将该函数的返回值当做判断依据
salary_dict = {
    'nick': 3000,
    'jason': 100000,
    'tank': 5000,
    'sean': 2000
}

print(max(salary_dict))  # tank

def func(k):
    return salary_dict[k]

print(max(salary_dict, key=func))  # jason
print(max(salary_dict, key=lambda name: salary_dict[name] ) )  # jason  匿名函数

2.sorted()

如果我们想对上述字典中的人,按照薪资从大到小排序,可以使用sorted()方法。

  • 首先将可迭代对象变成迭代器对象
  • res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值当做判断依据。
lis = [1, 3, 2, 5, 8, 6]
sorted(lis)
print(lis)  # [1, 3, 2, 5, 8, 6]
print(sorted(lis, reverse=True))  # [8, 6, 5, 3, 2, 1]

salary_dict = {
    'nick': 3000,
    'jason': 100000,
    'tank': 5000,
    'sean': 2000
}

print(sorted(salary_dict, key=lambda name: salary_dict[name] ))  # ['sean', 'nick', 'tank', 'jason']

3.map()

如果我们想对一个列表中的某个人名做处理,可以使用map()方法。

  • 首先将可迭代对象变成迭代器对象
  • res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后将该函数的返回值作为map()方法的结果之一。
name_list = ['jason', 'tank', 'sean']

res = map(lambda name: f"{name} sb", name_list)
print(list(res))  # ['jason sb', 'tank sb', 'sean sb']

4.filter()

如果我们想筛选除名字中含有'sb'的名字,我们可以使用filter()方法。

  • 首先将可迭代对象变成迭代器对象
  • res=next(迭代器对象),将res当做参数传给第一个参数指定的函数,然后filter会判断函数的返回值的真假,如果为真则留下。
name_list = ['nick', 'jason sb', 'tank sb', 'sean sb']

filter_res = filter(lambda name: name.endswith('sb'), name_list)
print(list(filter_res))  # ['jason sb', 'tank sb', 'sean sb']

七、内置函数

共68个:

abs()、 all()、 any()、 ascii()、 bin()、 bool()、 bytearray()、 bytes()、 callable()、 chr()、 classmethod()、 compile()、 complex()、 delattr()、 
dict()、 dir()、 divmod()、 enumerate()、 eval()、 exec()、 filter()、 float()、 format()、 frozenset()、 getattr()、 globals()、 hasattr()、 hash()、 
help()、 hex()、 id()、 input()、 int()、 isinstance()、 issubclass()、 iter()、 len()、 list()、 locals()、 map()、 max()、 memoryview()、 
min()、 next()、 object()、 oct()、 open()、 ord()、 pow()、 print()、 property()、 range()、 repr()、 reversed()、 round()、 set()、 
setattr()、 slice()、 sorted()、 staticmethod()、 str()、 sum()、 super()、 tuple()、 type()、 vars()、 zip()、 __import__()、

1.bytes():解码字符。

res = '你好'.encode('utf8')
print(res)  # b'\xe4\xbd\xa0\xe5\xa5\xbd'
res = bytes('你好', encoding='utf8')
print(res)  # b'\xe4\xbd\xa0\xe5\xa5\xbd'

2.chr()/ord():chr()参考ASCII码表将数字转成对应字符;ord()将字符转换成对应的数字。

print(chr(65)) #A
print(ord('A')) #65

3.divmod():分栏。

print(divmod(10, 3)) #(3, 1)

4.enumerate():带有索引的迭代。

l = ['a', 'b', 'c']
for i in enumerate(l):
    print(i)

# (0, 'a')
# (1, 'b')
# (2, 'c')

5.eval():把字符串翻译成数据类型。

lis = '[1,2,3]'
lis_eval = eval(lis)
print(lis_eval) #[1, 2, 3]

6.hash():是否可哈希。

print(hash(1)) #1

7.abs():求绝对值。

print(abs(-13))  # 13

8.all():可迭代对象内元素全为真,则返回真。

print(all([1, 2, 3, 0])) #False
print(all([])) #True

9.any():可迭代对象中有一元素为真,则为真。

print(any([1, 2, 3, 0])) #True
print(any([])) #False

10.bin()/oct()/hex():二进制、八进制、十六进制转换。

print(bin(17)) #0b10001
print(oct(17)) #0o21
print(hex(17)) #0x11

11.dir():列举出所有time的功能。

import time
print(dir(time))
# ['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'perf_counter', 'process_time', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname', 'tzset']

12.frozenset():不可变集合。

s = frozenset({1, 2, 3})
print(s) #({1, 2, 3})

13.globals()/loacals():查看全局名字;查看局部名字。

# print(globals())
def func():
    a = 1
    #     print(globals())
    print(locals())

func()  # {'a': 1}

14.pow():

print(pow(3, 2, 3))  # (3**2)%3 =0

15.round():

print(round(3.5)) #4

16.slice():

lis = ['a', 'b', 'c']
s = slice(1, 4, 1)
print(lis[s]) #['b', 'c']
# print(lis[1:4:1])

17.sum():

print(sum(range(100))) #4950

18.__import__():通过字符串导入模块。

m = __import__('time')
print(m.time()) #1556607502.334777

19. 面向对象知识点

  • classmethod
  • staticmethod
  • property
  • delattr
  • hasattr
  • getattr
  • setattr
  • isinstance()
  • issubclass()
  • object()
  • super()

到此这篇关于Python函数的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Python定义一个函数的方法

    Python函数的定义 定义函数,也就是创建一个函数,可以理解为创建一个具有某些用途的工具.定义函数需要用 def 关键字实现,具体的语法格式如下: def 函数名(形参列表): //由零条到多条可执行语句组成的代码块 [return [返回值]] 其中,用 [] 括起来的为可选择部分,即可以使用,也可以省略. 此格式中,各部分参数的含义如下: 函数名:从语法角度来看,函数名只要是一个合法的标识符即可:从程序的可读性角度来看,函数名应该由一个或多个有意义的单词连缀而成,每个单词的字母全部小写,单

  • python函数的重新定义及练习

    目录 python函数 一.函数定义 二.自定义函数 1.自定义函数规则: 2.一般形式 三.函数调用 四.参数 正式参数类型: 五.变量作用域 六.函数的递归调用 python的文件操作 课后作业 习题1: 习题2: 总结 python函数 一.函数定义 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 你已经知道Python提供了许多内建函数(库函数),比如print(). 但你也可以自己创建函数,这被叫做用户自定义函数. 函数

  • Python匿名函数详情

    1.匿名函数 在python中,除了一般使用def定义的函数外,还有一种使用lambda定义的匿名函数.这种函数可以用在任何普通函数可以使用的地方,但在定义时被严格限定为单一表达式.从语义上讲,它只是普通函数的语法糖. 如果我们需要定义一个特别简单的函数,例如 def add(a, b):     s = a + b     return s 这就出现问题了,这么优雅的Python怎么可以出现这种难看的代码呢,有没有办法可以将其简化为1行代码呢?这么优雅的Python肯定有办法将其简化的方法啊!

  • Python 如何定义匿名或内联函数

    问题 你想为 sort() 操作创建一个很短的回调函数,但又不想用 def 去写一个单行函数, 而是希望通过某个快捷方式以内联方式来创建这个函数. 解决方案 当一些函数很简单,仅仅只是计算一个表达式的值的时候,就可以使用lambda表达式来代替了.比如: >>> add = lambda x, y: x + y >>> add(2,3) 5 >>> add('hello', 'world') 'helloworld' >>> 这里使用

  • python基础之函数的定义和调用

    # 第一题 # 写函数,接受n个数字,求这些参数数字的和 def sumFunc(*args): # 处理接受的数据 result=0 for item in args: result+=item pass return result pass # 调用 rs=sumFunc(1,2,3,4) print('rs={}'.format(rs)) #填坑法 format格式化输出 # 写函数找出传入的列表或元组的奇数位对应的元素,并返回一个新的列表 def processFunc(con): li

  • 什么是Python中的匿名函数

    匿名函数 lambda x , y : x+y 1.匿名的目的就是要没有名字,给匿名函数赋给一个名字是没有意义的. 2.匿名函数的参数规则.作用域关系与有名函数是一样的. 3.匿名函数的函数体通常应该是 一个表达式,该表达式必须要有一个返回值. f=lambda x,n:x ** n print(f(2,3)) lambda匿名函数的应用:**max,min,sorted,map,reduce,filter** 求工资最高的人:max salaries={ 'egon':3000, 'alex'

  • python基础之匿名函数详解

    目录 1.匿名函数介绍 2.语法 3.使用场景 4.匿名函数和普通函数的对比 5.匿名函数的多种形式 6.lambda 作为一个参数传递 7. lambda函数与python内置函数配合使用 8.lambda 作为函数的返回值 1.匿名函数介绍 匿名函数指一类无须定义标识符的函数或子程序.Python用lambda语法定义匿名函数,只需用表达式而无需申明. 在python中,不通过def来声明函数名字,而是通过 lambda 关键字来定义的函数称为匿名函数. lambda函数能接收任何数量(可以

  • Python如何定义有默认参数的函数

    问题 你想定义一个函数或者方法,它的一个或多个参数是可选的并且有一个默认值. 解决方案 定义一个有可选参数的函数是非常简单的,直接在函数定义中给参数指定一个默认值,并放到参数列表最后就行了.例如: def spam(a, b=42): print(a, b) spam(1) # Ok. a=1, b=42 spam(1, 2) # Ok. a=1, b=2 如果默认参数是一个可修改的容器比如一个列表.集合或者字典,可以使用None作为默认值,就像下面这样: # Using a list as a

  • python基础之引用和匿名函数

    a=1 #1 为对象, def func(x): print('x的地址{}'.format(id(x))) x=2 print('x的地址{}'.format(id(x))) pass # 调用函数 print('a的地址:{}'.format(id(a))) func(a) # 不可变类型 a=1 #1 为对象, ##传递的是一个对象的引用,并不是一个值 def func(x): print('x的地址{}'.format(id(x))) x=2 print('x的地址{}'.format(

  • python 匿名函数相关总结

    写python的时候,大多数场景下,我都是if else选手,因为最核心的逻辑几乎都是通过if else语句来实现的.关于匿名函数这块儿,其实可以用常见的循环等方法来实现,但是如果你想成为一个python的高手,匿名函数还是必须要了解的.因为匿名函数,能够让你的代码足够简洁, 01  什么是匿名函数? 在python中,匿名函数,顾名思义,就是没有名字的函数,它主要用在那些只使用一次的场景中.如果我们的程序中只需要调用一次某个简单逻辑,把它写成函数还需要先定义.取函数名字等一些列操作,这种场景下

  • python匿名函数的实例用法

    一般情况下,lambda就像是一个函数简化器,它允许在所用代码中嵌入函数的定义.它们完全是可选的(一直都可以使用def替换它们),但只需嵌入少量可执行代码,就能使代码结构更加简洁,从而大大简化代码复杂性,提高代码可读性. 1.优点 (1)减少重复代码: (2)模块化代码. 2.实例 # def函数 def square(x): return x**2 squared = map(square, [1, 2, 3, 4, 5]) # lambda函数 squared = map(lambda x:

随机推荐