函数基础

复制代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:woshinidaye
'''
函数!function
几种编程方法
1、面向对象:类(class)、
2、面向过程:过程(def)
3、函数式编程:函数(def)
'''

'''
#定义一个------函数
def test(x):            #函数名
    #this is a test function       #描述
    x = x+1         #代码块
    return x        #定义返回值,并终止函数
print(test(2))

#定义一个------过程:过程是没有返回值的函数
def test2():
    #this is a test function
    print('for process')
print('====>>>',test2())    #test2没有定义返回值,python返回none

#函数的运用,可以把某一段重复性的功能用函数实现,这样实现了代码的重复利用
#而且代码的修改可以直接在函数上进行修改,
import time
def log():
    #time_format = '%Y-%m-%d %X'
    time_current = time.strftime('%z-%Y-%m-%d %X')
    with open('log.txt','a+',encoding='utf-8') as f:
        f.write('%s\ttest line\n'%time_current)
def test_log_1():
    print('function test_log_1')
    #time.sleep(3)
    log()
def test_log_2():
    print('function test_log_2')
    #time.sleep(3)
    log()
test_log_1()
test_log_2()
'''

'''
def test():
    print('this is test function!')
    return 0
    print('还对打印这一行吗??')             #前面是return 0,说明函数已经介绍,并返回0,这一行将不会被执行
test()
print(test())
x = test()              #return的值可以赋予x
print('====>>>',x)
'''

'''
#return的类型
def test1():
    print('test1')
def test2():
    print('test2')
    return 0
def test3():
    print('test3')
    return 1,'hello world',['zhangsan','lisi'];{'zhangsan':'lisi'}
x1 = test1()        #没定义return,解释器显示返回0
x2 = test2()        #return 0
x3 = test3()        #返回元组
print(x1,'\n',x2,'\n',x3,'\n',x3[1])
'''


#定义有参数的函数
'''
def test(x,y):
    print(x)
    print(y)
test(1,2)       #形参x、Y、实参1、2。形参的数量=实参的数量 #位置参数调用,与形参一一对应
test(x=2,y=2)   #关键字调用,与形参书序无关
#关键参数不能写在位置参数前面!!!!!!!
#test(x=1,2)     #positional argument follows keyword argument
test(3,y=4)         #可以正常运行,3赋值给x
#test(3,x=3)           #test() got multiple values for argument 'x'
def test1(x,y,z):
    print(x)
    print(y)
    print(z)
test1(1,2,3)
print('>>>>>>><<<<<<<')
test1(1,z=3,y=1)
'''
#默认参数:用于默认安装、连接数据库的端口号
#def test1(x,y=2,z):         #SyntaxError: non-default argument follows default argument,默认参数后面只能跟默认参数

'''def test1(x,y,z=2):         #SyntaxError: non-default argument follows default argument,默认参数后面只能跟默认参数
    print(x)
    print(y)
    print(z)
test1(1,2,3)
test1(1,2,z=2)
test1(1,2)'''

#除开默认参数,要求形参的个数与实参的个数相等,但是如何实现任意多个实参,函数都能正常运行呢?
#参数组
#*args,接收N个位置参数,转为元组
'''
def test2(*args):
    print(args)
test2(1,2,2,2,3,4,4,4)
test2(1,2,3,4,213,5,6,7,8,9,0,12)       #结果会把实参全放到元组中
test2(*[1,2,3,4,213,5,6,7,8,9,0,12])    #结果会把实参全放到元组中 *[1,2,3,4,213,5,6,7,8,9,0,12] = *args   args=tuple([1,2,3,4,213,5,6,7,8,9,0,12])
'''

'''
def test3(x,y,z=3,*args):
    print(x)
    print(y)
    print(z)
    print(args)
test3(1,2)      #结果,x=1 y=2 z=3 元组为空
test3(1,2,4)     #结果,x=1 y=2 z=4 元组为空
test3(1,2,4,[12313,234,567])    #把[12313,234,567]这个列表作为一个合在一起的参数,等于是传入了一个参数
test3(1,2,4,*[12313,234,567])   #把args=[12313,234,567]这个列表先转换为tuple,之后再传入,等于是传入了三个参数
a = [12313]
b = tuple([12313,234,567])
print(a,type(a))
print(b,type(b))
'''

#**kwargs,接收N个关键字参数,转为字典
'''
def test3(x,y,z=3,**kwargs):            #把关键字参数转化为字典
    print(x)
    print(y)
    print(z)
    print(kwargs)
    print(kwargs['name'])
test3(1,2,name='zhangsan',age=123)
test3(1,2,3,name='zhangsan',age=123)
test3(1,2,3,**{'name':'zhangsan','age':123})

def test3(x,y,z=3,**kwargs):            #把关键字参数转化为字典
    print(x)
    print(y)
    print(z)
    print(kwargs)
    print(kwargs['name'])
    logger('test3')
def logger(source):
    print('from %s' % source)
test3(1,2,3,name=123,age=18)
'''

#局部变量
# age = 123               #全局变量,强烈不建议在函数内部修改全部变量
# name = 'zhangsan'
# def change_name(name):
#     #global age
#     print('before change,your name is %s,age is %s ' % (name,age))      #函数里面也可以直接引导全局变量
#     #age = 12345678     #要从函数内部修改全局变量,需要添加global命令
#     name = 'lisi'       #这里就是局部变量,这个变量的作用域仅存在与这个函数。。。
#     print('after change,your name is %s' %name)
#
# change_name(name)
# print(name)             #结果还时张三
# print(age)

# names = ['zhangsan','lisi','laowang']
# def change_names():
#     names[0] = 'mytest'
#     print('===>',names)
# change_names()
# print(names)            #在函数里面居然改了,全局也生效了!!
#这是因为列表、字典、集合、类,均可以在局部,对全部修改。除了字符串和整数,不能在局部修改

#递归函数
#自己调用自己,类似于贪吃蛇,
# 必须有明确的结束条件maximum recursion depth exceeded while calling a Python object
#每一次递归的问题参数逐层减少
#递归函数的处理速度较慢
# def sum(n):
#     print(n)
#     return sum(n)
# sum(10)

# def calc(n):
#     print(n)
#     if int(n/2) >= 1:
#         return calc(int(n/2))
#     print('====>>>',n)          #上面的递归函数执行完了,才会执行到这一步
# a = 1.231412
# print(a,type(a),int(a),type(int(a)))
# calc(100)

#高阶函数:将一个函数以参数的形式传给另外一个函数,这个函数就成为高阶函数
def cal(x,y,f):
    # c = x + y
    # print(c)
    # return c
    return f(x)+f(y)
# cal(1,2)
test = cal(3,-8,abs)
# print(cal(1,2))
# print(abs(123-1234))
print(test)
复制代码

 

posted @   woshinidaye  阅读(30)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
点击右上角即可分享
微信分享提示