python入门(六):函数

1.系统自带的函数:

>>> dir(__builtins__)

[‘ArithmeticError‘, ‘AssertionError‘, ‘AttributeError‘, ‘BaseException‘, ‘BlockingIOError‘, ‘BrokenPipeError‘, ‘BufferError‘, ‘BytesWarning‘, ‘ChildProcessError‘, ‘ConnectionAbortedError‘, ‘ConnectionError‘, ‘ConnectionRefusedError‘, ‘ConnectionResetError‘, ‘DeprecationWarning‘, ‘EOFError‘, ‘Ellipsis‘, ‘EnvironmentError‘, ‘Exception‘, ‘False‘, ‘FileExistsError‘, ‘FileNotFoundError‘, ‘FloatingPointError‘, ‘FutureWarning‘, ‘GeneratorExit‘, ‘IOError‘, ‘ImportError‘, ‘ImportWarning‘, ‘IndentationError‘, ‘IndexError‘, ‘InterruptedError‘, ‘IsADirectoryError‘, ‘KeyError‘, ‘KeyboardInterrupt‘, ‘LookupError‘, ‘MemoryError‘, ‘ModuleNotFoundError‘, ‘NameError‘, ‘None‘, ‘NotADirectoryError‘, ‘NotImplemented‘, ‘NotImplementedError‘, ‘OSError‘, ‘OverflowError‘, ‘PendingDeprecationWarning‘, ‘PermissionError‘, ‘ProcessLookupError‘, ‘RecursionError‘, ‘ReferenceError‘, ‘ResourceWarning‘, ‘RuntimeError‘, ‘RuntimeWarning‘, ‘StopAsyncIteration‘, ‘StopIteration‘, ‘SyntaxError‘, ‘SyntaxWarning‘, ‘SystemError‘, ‘SystemExit‘, ‘TabError‘, ‘TimeoutError‘, ‘True‘, ‘TypeError‘, ‘UnboundLocalError‘, ‘UnicodeDecodeError‘, ‘UnicodeEncodeError‘, ‘UnicodeError‘, ‘UnicodeTranslateError‘, ‘UnicodeWarning‘, ‘UserWarning‘, ‘ValueError‘, ‘Warning‘, ‘WindowsError‘, ‘ZeroDivisionError‘, ‘__build_class__‘, ‘__debug__‘, ‘__doc__‘, ‘__import__‘, ‘__loader__‘, ‘__name__‘, ‘__package__‘, ‘__spec__‘, ‘abs‘, ‘all‘, ‘any‘, ‘ascii‘, ‘bin‘, ‘bool‘, ‘bytearray‘, ‘bytes‘, ‘callable‘, ‘chr‘, ‘classmethod‘, ‘compile‘, ‘complex‘, ‘copyright‘, ‘credits‘, ‘delattr‘, ‘dict‘, ‘dir‘, ‘divmod‘, ‘enumerate‘, ‘eval‘, ‘exec‘, ‘exit‘, ‘filter‘, ‘float‘, ‘format‘, ‘frozenset‘, ‘getattr‘, ‘globals‘, ‘hasattr‘, ‘hash‘, ‘help‘, ‘hex‘, ‘id‘, ‘input‘, ‘int‘, ‘isinstance‘, ‘issubclass‘, ‘iter‘, ‘len‘, ‘license‘, ‘list‘, ‘locals‘, ‘map‘, ‘max‘, ‘memoryview‘, ‘min‘, ‘next‘, ‘object‘, ‘oct‘, ‘open‘, ‘ord‘, ‘pow‘, ‘print‘, ‘property‘, ‘quit‘, ‘range‘, ‘repr‘, ‘reversed‘, ‘round‘, ‘set‘, ‘setattr‘, ‘slice‘, ‘sorted‘, ‘staticmethod‘, ‘str‘, ‘sum‘, ‘super‘, ‘tuple‘, ‘type‘, ‘vars‘, ‘zip‘]

2.定义一个函数

>>> def a2_333():             #def定义一个函数,a2_333函数名,字母开头

...     pass                  #()中的参数可有可无

...

>>> a2_333                  #未调用函数,只是打印了一下函数名

<function a2_333 at 0x0000019CF2431EA0>      #function代表该名字是函数

#at代表了该函数在内存中的地址

>>> a2_333()                 #函数名后加(),便可调用该函数

>>>

>>> def count_letter(s):        #函数名不要与系统自带的函数名、定义的变量名冲突,

...     result=0               #s为参数,在括号中可以写多个参数,无限制

...     for i in s:

...         if i >="a" and i <="z":

...             result=result+1

...     return result            #函数执行完毕后,一定要有个返回值

...

>>> count_letter("a1b2Z3")

2

>>> count_letter("skdjhf3ksdhf")   #函数定义好后,传不同的参数,均能正确输出

11                             #封装的概念,调用时不用关注内部的逻辑

>>>count_letter()                #调用的时候,传参一个都不能少,除非函数使用默认

Traceback (most recent call last):    #参数

File "<stdin>", line 1, in <module>

TypeError: count_letter() missing 1 required positional argument: ‘s‘

>>> def count_digit(s):

...     result=0

...     for i in s:

...         if i>="0" and i<="9":

...             result+=1

...                                    #该函数就没有返回值

...

>>> print(count_digit("sadhfasjdgsjf"))     #没有return的函数,默认返回None

None

>>> print(count_digit("ssjhd24"))         #没有return的函数,默认返回None

None

>>> def count_digit(s):

...     result=0

...     for i in s:

...         if i>="0" and i<="9":

...             result+=1

...     return                         #有return,但是后面没有写任何参数

...

>>> print(count_digit("sadhfasjdgsjf"))   #依然返回None

None

>>> print(count_digit("ssjhd24"))

None

>>> print(None)                       #单独打印None,还是会有结果输出

None

>>> print(none)                       #打印小写none,提示未定义

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

NameError: name ‘none‘ is not defined

3.函数的建壮性

输入两个数,返回相加的结果:

def add(a,b):

return(a+b)

print(add(1,2))              #在文件中执行时,一定要加print,否则无输出结果

>>> add(1,2)               #终端模式时,不必加print便有正确输出

3

该代码存在安全隐患,如果a,b类型不一致,会报错

>>> def add(a,b):

...     return(a+b)

...

>>> add(1,"2")             #传入的a,b的类型不一致

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "<stdin>", line 2, in add

TypeError: unsupported operand type(s) for +: ‘int‘ and ‘str‘

改进后的代码是:

def add(a,b):

if isinstance(a,(int,float,complex)) and isinstance(b,(int,float,complex)): #判断a,b是否都

return(a+b)                                             #是int类型

print("Adding different types of objects is not supported")       #return具有短路功能

return None

print(add(1,"2"))

执行结果:

E:\>python a.py

Adding different types of objects is not supported

None

4.函数的作用域

>>> n=1                    #全局变量

>>> def func():

...     n=2                  #在函数内部定义的变量叫做局部变量,函数体内部有效

...     return n

...

>>> print(func())             #返回函数内的n值

2

>>> print(n)                 #返回全局变量n的值

1

>>> def func():

...     n=2                   #只存在一个局部变量n,不存在全局变量n

...     return n

...

>>> print(func())

2

>>> print(n)                  #不存在全局变量n,提示n未定义

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

NameError: name ‘n‘ is not defined

n=1                          #全局变量中有n

def func():

return n+1                #函数中使用了n,但是在函数中未定义,会现在函数体内

#部找n,如果找不到,就到函数外面找

print(func())

运行结果:

E:\>python a.py

2                             #依然能返回正确的结果

n=1                          #n是全局变量

def func():

n+=1                     #n在函数中还未赋值,就加1

return n

print(func())

print(n)

运行结果:

E:\>python a.py

Traceback (most recent call last):

File "a.py", line 6, in <module>

print(func())

File "a.py", line 3, in func

n+=1

UnboundLocalError: local variable ‘n‘ referenced before assignment

局部变量n在赋值前被引用了,意思就是还未赋值

解决方法:在函数内部也先赋一下值

n=1

def func():

n=10

n+=1

return n

print(func())

print(n)

运行结果:

E:\>python a.py

11

1

解决方法:使用全局变量的n

n=1

def func():

global n              #函数内部,也使用全局变量的n

n+=1                #函数内部n+1,同时全局变量的n也加了1

return n

print(func())

print(n)

运行结果:

E:\>python a.py           #n为2

2                       #此方法不推荐

2

n=1

def func(a):

a+=1

return a

print(func(n))             #传的参数为n,n在程序中是全局变量1,所以a=2

print(n)                  #此方法比较推荐使用

运行结果:

E:\>python a.py

2

1

n=[]                     #n在全局变量的位置,但是是列表,列表是可变对象

def func(a):

a.append(1)

return a

print(func(n))

print(n)

运行结果:

E:\>python a.py

[1]

[1]

n={}

def func(a):

a[1]=1

return a

print(func(n))

print(n)

运行结果;

E:\>python a.py

{1: 1}

{1: 1}

n="abc"

def func(a):

a=a+"d"

return a

print(func(n))

print(n)

运行结果:

E:\>python a.py

abcd

abc

原则1:

如果你传入的参数是变量a,这个变量是可变类型(list,dict,set)

那么函数内部对于这个参数的所有操作结果都会影响外部的参数值

原则2:

如果你传入的参数是个变量a,这个变量是不可变类型(字符串,整数,小数,元祖)

那么函数内部对于这个参数的所有操作结果都不会影响外部的参数值

>>> def func():

...     n=2

...     return n

...

>>> func=1                 #func是一个函数的名字,赋值后,从函数变成了int

>>> func()                  #整数加(),打印时提示不可调用

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: ‘int‘ object is not callable

>>> del func                #非内置的函数,提示不可调用后,可删除后再次定义

>>> def func():

...     n=2

...     return n

...

>>> print(func())             #函数功能正常

2

>>> del func()               #当删除函数时,不要加(),否则会报错儿

File "<stdin>", line 1

SyntaxError: can‘t delete function call

>>> print(len("abc"))          #len函数是系统自带的函数

3

>>> len=10

>>> print(len)               #len变成了10

10

>>> print(len("abc"))         #此时在调用函数,提示int类型不可调用

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: ‘int‘ object is not callable

>>> del len                   #删除掉len

>>> print(len("abc"))           #len为系统自带函数,删除后未经再次定义依然可以调用

3

5.调用时参数

1)       必填参数

>>> def add(a,b):             #函数定义了两个参数a,b

...     return(a+b)

...

>>> print(add(1))             #调用时只传入了一个参数

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: add() missing 1 required positional argument: ‘b‘       #报错,少参数

2)       可选参数

>>> def add(a,b=100):        #定义了两个参数a,b,b的默认值是100

...     return(a+b)

...

>>> print(add(1))             #虽然只传入了一个参数,但是能正确输出结果,原因在于

101                         #b使用的是默认参数值

默认值是在定义时就设定的。

>>> def add(a,b=100):        #参数b的默认值是100

...     return(a+b)

...

>>> print(add(1,10))         #传入的b值是10

11                         #最后打印使用的是传入的值,非默认值

>>> def add(a,b=100):

...     return(a+b)

...

>>> print(add(b=1,a=10))   #调用时,参数赋值,也可正确输出

11

>>> def add(a,b=100):       #a是必填参数,b是可选参数

...     return a+b

...

>>> print(add(b=1))         #传参时,必填参数无,会报错

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

TypeError: add() missing 1 required positional argument: ‘a‘

>>> def add(a=100,b):       #默认值参数后有非默认值参数

...     return a+b

...

File "<stdin>", line 1

SyntaxError: non-default argument follows default argument

默认值参数后面跟了非默认值参数

函数定义时,默认值参数的后面不能有非默认值参数,

3)       可变参数:

def add(a,b,*c):

print(type(c))

print(c)                        #可变参数不需要对应,便可正确输出

return a,b,c

print(add(1,2,3,4,5))

运行结果:

E:\>python a.py

<class ‘tuple‘>                     #c的类型是元祖

(3, 4, 5)                           #c的值是(3,4,5)

(1, 2, (3, 4, 5))                      #a的值是1,b的值是2

def add(a,b,**c):                #c前面有两个*

print(type(c))

print(c)

print(add(1,2,c=3,d=4,e=5))

运行结果:

E:\>python a.py

<class ‘dict‘>                  #c的类型是dict

{‘c‘: 3, ‘d‘: 4, ‘e‘: 5}              #c的值是赋值的结果,c,d,e是key,3,4,5,是value

None

>>> def add(a,b,*c):

...     print(type(c))

...     print(c)

...     return a,b,c

...

>>> print(add(1,2,3,4,5))

<class ‘tuple‘>

(3, 4, 5)

(1, 2, (3, 4, 5))

>>> print(a)                            #a为非可变参数,未对应赋值,便提示未定义

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

NameError: name ‘a‘ is not defined

def add(a,b,*c):

print(type(c))

print(c)

return a,b,c

a,b,*c=add(1,2,3,4,5)                    #a,b非可变参数赋值后,可正常打印

print(add(1,2,3,4,5))

print(a)

print(b)

运行结果:

E:\>python a.py

<class ‘tuple‘>

(3, 4, 5)

<class ‘tuple‘>

(3, 4, 5)

(1, 2, (3, 4, 5))

1

2

6.返回时多个参数

def time_ten_bigger(a,b):

return a*10,b*10

print(time_ten_bigger(1,10))

print(a)

print(b)

运行结果:

E:\>python a.py

(10, 100)                       #返回了函数调用的结果

Traceback (most recent call last):

File "a.py", line 5, in <module>

print(a)

NameError: name ‘a‘ is not defined#print(a)提示a未定义

正确的代码是:

def time_ten_bigger(a,b):

return a*10,b*10           #返回两个值,实际自动的将两个值放在了元祖里

a,b=time_ten_bigger(1,10)       #将a,b分别与函数的参数对应

print(time_ten_bigger(1,10))

print(a)

print(b)

运行结果:

E:\>python a.py

(10, 100)                       #函数返回的值

10                             #a的值

100                            #b的值

def time_ten_bigger(a,b):

return a*10,b*10             #函数返回值参数都乘以10

a,b=time_ten_bigger(1,10)         #a是1的十倍,b是10的十倍

print(time_ten_bigger(b=1,a=10))   #这个函数定义的参数前后位置不一样

print(a)

print(b)

运行结果:

E:\>python a.py

(100, 10)

10

100

小练习:

1.统计一句话中有多少个数字

>>> def count_digit(s):

...     result=0

...     for i in s:

...         if i>="0" and i<="9":

...             result+=1

...     return result

...

>>> count_digit("sadhfasjdgsjf")

0

>>> count_digit("ssjhd24")

2

2.使用可变参数的方式求1-5的和

def add(a,b,*c):                  #c是个元祖,使用遍历的方法

result=0

for i in c:

result+=i

return result+a+b

print(add(1,2,3,4,5))

运行结果:

E:\>python a.py

15

3.使用可变参数,求add(1,2,c=3,d=4,e=5)所有数的和

def add(a,b,**c):                  #c是字典,遍历字典的values值

result=0                     #方法1:

for i in c.values():

result+=i

return a+b+result

print(add(1,2,c=3,d=4,e=5))

运行结果:

E:\>python a.py

15

def add(*a,**c):                #方法2:字典+元祖

result=0

for i in a:

result+=i

for i in c.values():

result+=i

return result

print(add(1,2,c=3,d=4,e=5))

运行结果:

E:\>python a.py

15

4.使用可变参数,求add(1,2,3,4,c=5,d=6,e=7)的和

def add(a,b,*c,**d):

result=a+b

for i in d.values():

result+=i

for i in c:

result+=i

return result

print(add(1,2,3,4,c=5,d=6,e=7))

运行结果:

E:\>python a.py

28

原文地址:https://www.cnblogs.com/suitcases/p/10362832.html

时间: 2024-10-10 20:15:26

python入门(六):函数的相关文章

python入门六 函数

定义 返回值 位置参数和关键字参数 参数传递 值传递 不可变对象 默认参数 原文地址:https://www.cnblogs.com/jing-yu/p/9105792.html

python入门15 函数

函数 1 python内置函数 2 匿名函数lambda 3 自定义函数 def functionname(arg):... #coding:utf-8 #/usr/bin/python """ 2018-11-11 dinghanhua 函数 """ '''内置函数''' print(round(2.345,2)) #四舍五入,保留2位小数;绝对值 print(abs(-23.333)) #绝对值 '''匿名函数 lambda''' lambd

(一)Python入门-5函数:03函数也是对象-内存分析

函数也是对象,内存底层分析: Python中,“一切都是对象”.实际上,执行def 定义函数后,系统就创建了相应的函数 对象.我们执行如下程序,然后进行解释: 1 #函数也是对象 2 def print_star(n): 3 print('*'*n) 4 5 print_star(3) 6 c = print_star 7 c(3) 8 9 print(id(print_star)) 10 print(id(c)) 11 print(type(c)) 上面代码执行 def 时,系统中会创建函数对

(一)Python入门-5函数:07lambda表达式和匿名函数-eval()函数

一:lambda表达式和匿名函数 lambda表达式可以用来声明匿名函数.lambda 函数是一种简单的.在同一行中定义函数 的方法.lambda函数实际生成了一个函数对象. lambda表达式只允许包含一个表达式,不能包含复杂语句,该表达式的计算结果就是函数 的返回值. lambda表达式的基本语法如下: lambda arg1,arg2,arg3... : <表达式> arg1/arg2/arg3为函数的参数.<表达式>相当于函数体.运算结果是:表达式的运算结果. #lambd

Python入门之函数的装饰器

本章目录: 装饰器: 一.为什么要用装饰器 二.什么是装饰器 三.无参装饰器 四.装饰器语法糖 五.认证装饰器实现 六.叠加多个装饰器 七.带参装饰器 =========================================================== 一.开放封闭原则 引子--为什么要用装饰器 软件一旦上线后,对修改源代码是封闭的,对功能扩展是开放的. 也就是说我们必须找到一种解决方案: 能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能 总结,原则如下: 1.不

python入门(六)

python函数与模块 一.python函数 1.认识函数 函数分为系统函数与自定义函数. 1 #coding=utf-8 2 ''' 3 Created on 2016年4月19日 4 5 @author: Administrator 6 ''' 7 #函数的功能 8 #系统函数 9 #1.取字符串长度 10 ''' 11 a="hello world python!" 12 print len(a) 13 #2.字符串切割 14 a="student" 15 b

python入门基础-函数装饰器的理解

1.装饰器 # 知乎某大神是这么比喻装饰器的:内裤可以用来遮羞,但是到了冬天他就没有办法为我们御寒,聪明的人于是发明了长裤,有了长裤后宝宝再也不冷了, # 装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效. # # 大神是将程序中原本的函数比喻成内裤,而装饰器比喻成了长裤,这样在寒冬里它们结合一起使用就给所有人带来了温暖. # # 装饰器本质上是一个python函数,它可以让其它函数在不改动代码的情况下增加额外的功能,并且装饰器的返回值也是一个函数对象. # 在

(一)Python入门-5函数:01函数的基本概念-内存分析-函数的分类-定义和调用

一:函数介绍 函数是可重用的程序代码块.函数的作用,不仅可以实现代码的复用,更能实现代码的 一致性.一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现. 在编写函数时,函数体中的代码写法和我们前面讲述的基本一致,只是对代码实现了封 装,并增加了函数调用.传递参数.返回计算结果等内容. 函数基本概念: 1. 一个程序由一个个任务组成:函数就是代表一个任务或者一个功能. 2. 函数是代码复用的通用机制. 二:Python函数的分类 Python中函数分为如下几类: 1. 内置函数

(一)Python入门-5函数:10nonlocal-global-LEGB规则

一:nonlocal关键字 nonlocal 用来声明外层的局部变量. global 用来声明全局变量. #测试nonlocal.global关键字的用法 a = 100 def outer(): b = 10 def inner(): nonlocal b #声明外部函数的局部变量 print('inner:b',b) b = 20 #内部函数中修改了外部函数变量b的值 global a #声明全局变量 a = 200 inner() print('outer:b',b) outer() pr

(一)Python入门-5函数:05参数的传递-可变对象-不可变对象-浅拷贝和深拷贝-不可变对象含可变子对象

一:参数的传递 函数的参数传递本质上就是:从实参到形参的赋值操作. Python中“一切皆对象”, 所有的赋值操作都是“引用的赋值”.所以,Python中参数的传递都是“引用传递”,不 是“值传递”.具体操作时分为两类: 1. 对“可变对象”进行“写操作”,直接作用于原对象本身. 2. 对“不可变对象”进行“写操作”,会产生一个新的“对象空间”,并用新的值填 充这块空间.(起到其他语言的“值传递”效果,但不是“值传递”) 可变对象有: 字典.列表.集合.自定义的对象等 不可变对象有: 数字.字符