草根学Python(六) 函数

一文读懂Python 高阶函数 高阶函数 将函数作为参数传入,这样的函数称为高阶函数。函数式编程就是指这种高度抽象的编程范式。 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。如下所示: 1 def fun0(x,y,fun): 2 return fun(x)*fun(y) 3 print(fun0(-9,-10,abs)) 1. 高阶函数之map map(fun, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表返回。. 阅读详情

前言

前天创了个 Python 微信讨论群,以为没人进的,哈哈,想不到还真有小伙伴进群学习讨论。如果想进群,可以加我微信: androidwed ,拉进群,就不贴微信群二维码了,一是会失效,二影响文章。

目录

草根学Python(六)  函数

一、Python 自定义函数的基本步骤

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

自定义函数,基本有以下规则步骤:

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

语法示例:

def functionname( parameters ):
   "函数_文档字符串"
   function_suite
   return [expression]

实例:

  1. def 定义一个函数,给定一个函数名 sum
  2. 声明两个参数 num1 和 num2
  3. 函数的第一行语句进行函数说明:两数之和
  4. 最终 return 语句结束函数,并返回两数之和
def sum(num1,num2):
    "两数之和"
    return num1+num2

# 调用函数
print(sum(5,6))

输出结果:

11

二、函数传值问题

先看一个例子:

# -*- coding: UTF-8 -*-
def chagne_number( b ):
    b = 1000

b = 1
chagne_number(b)
print( b ) 

最后输出的结果为:

1

这里可能有些人会有疑问,为啥不是通过函数chagne_number更改了 b
的值吗?为啥没有变化,输出的结果还是 1 ,这个问题很多编程语言都会讲到,原理解释也是差不多的。

这里主要是函数参数的传递中,传递的是类型对象,之前也介绍了 Python 中基本的数据类型等。而这些类型对象可以分为可更改类型和不可更改的类型

在 Python 中,字符串,整形,浮点型,tuple 是不可更改的对象,而 list , dict 等是可以更改的对象。

例如:

不可更改的类型:变量赋值 a = 1,其实就是生成一个整形对象 1 ,然后变量 a 指向 1,当 a = 1000 其实就是再生成一个整形对象 1000,然后改变 a 的指向,不再指向整形对象 1 ,而是指向 1000,最后 1 会被丢弃

可更改的类型:变量赋值 a = [1,2,3,4,5,6] ,就是生成一个对象 list ,list 里面有 6 个元素,而变量 a 指向 list ,a[2] = 5则是将 list a 的第三个元素值更改,这里跟上面是不同的,并不是将 a 重新指向,而是直接修改 list 中的元素值。

指向问题

这也将影响到函数中参数的传递了:

不可更改的类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是 a 的值,没有影响 a 对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。

可更改的类型:类似 c++ 的引用传递,如 列表,字典。如 fun(a),则是将 a 真正的传过去,修改后 fun 外部的 a 也会受影响

因此,在一开始的例子中,b = 1,创建了一个整形对象 1 ,变量 b 指向了这个对象,然后通过函数 chagne_number 时,按传值的方式复制了变量 b ,传递的只是 b 的值,并没有影响到 b 的本身。具体可以看下修改后的实例,通过打印的结果更好的理解。

# -*- coding: UTF-8 -*-
def chagne_number( b ):
    print('函数中一开始 b 的值:{}' .format( b ) )
    b = 1000
    print('函数中 b 赋值后的值:{}' .format( b ) )


b = 1
chagne_number( b )
print( '最后输出 b 的值:{}' .format( b )  )

打印的结果:

函数中一开始 b 的值:1
函数中 b 赋值后的值:1000
最后输出 b 的值:1

当然,如果参数中的是可更改的类型,那么调用了这个函数后,原来的值也会被更改,具体实例如下:

# -*- coding: UTF-8 -*-

def chagne_list( b ):
    print('函数中一开始 b 的值:{}' .format( b ) )
    b.append(1000)
    print('函数中 b 赋值后的值:{}' .format( b ) )


b = [1,2,3,4,5]
chagne_list( b )
print( '最后输出 b 的值:{}' .format( b )  )

输出的结果:

函数中一开始 b 的值:[1, 2, 3, 4, 5]
函数中 b 赋值后的值:[1, 2, 3, 4, 5, 1000]
最后输出 b 的值:[1, 2, 3, 4, 5, 1000]

三、函数返回值

通过上面的学习,可以知道通过 return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。

具体示例:

# -*- coding: UTF-8 -*-

def sum(num1,num2):
    # 两数之和
    if not (isinstance (num1,(int ,float)) or isinstance (num2,(int ,float))):
        raise TypeError('参数类型错误')
    return num1+num2

print(sum(1,2))

返回结果:

3

这个示例,还通过内置函数isinstance()进行数据类型检查,检查调用函数时参数是否是整形和浮点型。如果参数类型不对,会报错,提示 参数类型错误,如图:

检查函数参数是否正确

当然,函数也可以返回多个值,具体实例如下:

# -*- coding: UTF-8 -*-

def  division ( num1, num2 ):
    # 求商与余数
         a = num1 % num2
         b = (num1-a) / num2
         return b , a 

num1 , num2 = division(9,4)
tuple1 = division(9,4)

print (num1,num2)
print (tuple1)

输出的值:

2.0 1
(2.0, 1)

认真观察就可以发现,尽管从第一个输出值来看,返回了多个值,实际上是先创建了一个元组然后返回的。回忆一下,元组是可以直接用逗号来创建的,观察例子中的 ruturn ,可以发现实际上我们使用的是逗号来生成一个元组。

四、函数的参数

1、默认值参数

有时候,我们自定义的函数中,如果调用的时候没有设置参数,需要给个默认值,这时候就需要用到默认值参数了。

# -*- coding: UTF-8 -*-

def print_user_info( name , age , sex = '男' ):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex))
    return;

# 调用 print_user_info 函数

print_user_info( '两点水' , 18 , '女')
print_user_info( '三点水' , 25 )

输出结果:

昵称:两点水 年龄:18 性别:女
昵称:三点水 年龄:25 性别:男

可以看到,当你设置了默认参数的时候,在调用函数的时候,不传该参数,就会使用默认值。但是这里需要注意的一点是:只有在形参表末尾的那些参数可以有默认参数值,也就是说你不能在声明函数形参的时候,先声明有默认值的形参而后声明没有默认值的形参。这是因为赋给形参的值是根据位置而赋值的。例如,def func(a, b=1) 是有效的,但是 def func(a=1, b) 是 无效 的。

默认值参数就这样结束了吗?还没有的,细想一下,如果参数中是一个可修改的容器比如一个 lsit (列表)或者 dict (字典),那么我们使用什么来作为默认值呢?我们可以使用 None 作为默认值。就像下面这个例子一样:

# 如果 b 是一个 list ,可以使用 None 作为默认值
def print_info( a , b = None ):
    if b is None :
        b=[]
    return;

认真看下例子,会不会有这样的疑问呢?在参数中我们直接 b=[] 不就行了吗?也就是写成下面这个样子:

def print_info( a , b = [] ):
    return;

对不对呢?运行一下也没发现错误啊,可以这样写吗?这里需要特别注意的一点:默认参数的值是不可变的对象,比如None、True、False、数字或字符串,如果你像上面的那样操作,当默认值在其他地方被修改后你将会遇到各种麻烦。这些修改会影响到下次调用这个函数时的默认值。

示例如下:

# -*- coding: UTF-8 -*-

def print_info( a , b = [] ):
    print(b)
    return b ;

result = print_info(1)

result.append('error')

print_info(2)

输出的结果:

[]
['error']

认真观察,你会发现第二次输出的值根本不是你想要的,因此切忌不能这样操作。

还有一点,有时候我就是不想要默认值啊,只是想单单判断默认参数有没有值传递进来,那该怎么办?我们可以这样做:

_no_value =object()

def print_info( a , b = _no_value ):
    if b is _no_value :
        print('b 没有赋值')
    return;

这里的 object 是python中所有类的基类。 你可以创建 object 类的实例,但是这些实例没什么实际用处,因为它并没有任何有用的方法, 也没有任何实例数据(因为它没有任何的实例字典,你甚至都不能设置任何属性值)。 你唯一能做的就是测试同一性。也正好利用这个特性,来判断是否有值输入。

2、关键字参数

在 Python 中,可以通过参数名来给函数传递参数,而不用关心参数列表定义时的顺序,这被称之为关键字参数。使用关键参数有两个优势 :

一、由于我们不必担心参数的顺序,使用函数变得更加简单了。

二、假设其他参数都有默认值,我们可以只给我们想要的那些参数赋值

# -*- coding: UTF-8 -*-

def print_user_info( name ,  age  , sex = '男' ):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex))
    return;

# 调用 print_user_info 函数

print_user_info( name = '两点水' ,age = 18 , sex = '女')
print_user_info( name = '两点水' ,sex = '女', age = 18 )

输出的值:

昵称:两点水 年龄:18 性别:女
昵称:两点水 年龄:18 性别:女

3、不定长参数

有时我们在设计函数接口的时候,可会需要可变长的参数。也就是说,我们事先无法确定传入的参数个数。Python 提供了一种元组的方式来接受没有直接定义的参数。这种方式在参数前边加星号 * 。如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。

例如:

# -*- coding: UTF-8 -*-

def print_user_info( name ,  age  , sex = '男' , * hobby):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex) ,end = ' ' )
    print('爱好:{}'.format(hobby))
    return;

# 调用 print_user_info 函数
print_user_info( '两点水' ,18 , '女', '打篮球','打羽毛球','跑步')

输出的结果:

昵称:两点水 年龄:18 性别:女 爱好:('打篮球', '打羽毛球', '跑步')

通过输出的结果可以知道,*hobby是可变参数,且 hobby其实就是一个 tuple (元祖)

可变长参数也支持关键参数,没有被定义的关键参数会被放到一个字典里。这种方式即是在参数前边加 **,更改上面的示例如下:

# -*- coding: UTF-8 -*-

def print_user_info( name ,  age  , sex = '男' , ** hobby ):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex) ,end = ' ' )
    print('爱好:{}'.format(hobby))
    return;

# 调用 print_user_info 函数
print_user_info( name = '两点水' , age = 18 , sex = '女', hobby = ('打篮球','打羽毛球','跑步'))

输出的结果:

昵称:两点水 年龄:18 性别:女 爱好:{'hobby': ('打篮球', '打羽毛球', '跑步')}   

通过对比上面的例子和这个例子,可以知道,*hobby是可变参数,且 hobby其实就是一个 tuple (元祖),**hobby是关键字参数,且 hobby 就是一个 dict (字典)

4、只接受关键字参数

关键字参数使用起来简单,不容易参数出错,那么有些时候,我们定义的函数希望某些参数强制使用关键字参数传递,这时候该怎么办呢?

将强制关键字参数放到某个*参数或者单个*后面就能达到这种效果,比如:

# -*- coding: UTF-8 -*-

def print_user_info( name , *, age  , sex = '男' ):
    # 打印用户信息
    print('昵称:{}'.format(name) , end = ' ')
    print('年龄:{}'.format(age) , end = ' ')
    print('性别:{}'.format(sex))
    return;

# 调用 print_user_info 函数
print_user_info( name = '两点水' ,age = 18 , sex = '女' )

# 这种写法会报错,因为 age ,sex 这两个参数强制使用关键字参数
#print_user_info( '两点水' , 18 , '女' )
print_user_info('两点水',age='22',sex='男')

通过例子可以看,如果 age , sex 不适用关键字参数是会报错的。

很多情况下,使用强制关键字参数会比使用位置参数表意更加清晰,程序也更加具有可读性。使用强制关键字参数也会比使用 **kw 参数更好且强制关键字参数在一些更高级场合同样也很有用。

五、匿名函数

有没有想过定义一个很短的回调函数,但又不想用 def 的形式去写一个那么长的函数,那么有没有快捷方式呢?答案是有的。

python 使用 lambda 来创建匿名函数,也就是不再使用 def 语句这样标准的形式定义一个函数。

匿名函数主要有以下特点:

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。

基本语法

lambda [arg1 [,arg2,.....argn]]:expression

示例:

# -*- coding: UTF-8 -*-

sum = lambda num1 , num2 : num1 + num2;

print( sum( 1 , 2 ) )

输出的结果:

3

注意:尽管 lambda 表达式允许你定义简单函数,但是它的使用是有限制的。 你只能指定单个表达式,它的值就是最后的返回值。也就是说不能包含其他的语言特性了, 包括多个语句、条件表达式、迭代以及异常处理等等。

匿名函数中,有一个特别需要注意的问题,比如,把上面的例子改一下:

# -*- coding: UTF-8 -*-

num2 = 100
sum1 = lambda num1 : num1 + num2 ;

num2 = 10000
sum2 = lambda num1 : num1 + num2 ;

print( sum1( 1 ) )
print( sum2( 1 ) )

你会认为输出什么呢?第一个输出是 101,第二个是 10001,结果不是的,输出的结果是这样:

10001
10001

这主要在于 lambda 表达式中的 num2 是一个自由变量,在运行时绑定值,而不是定义时就绑定,这跟函数的默认值参数定义是不同的。所以建议还是遇到这种情况还是使用第一种解法。

python数据结构与算法学习笔记(二) rotate反转数组,给定数组和k,数组最后k个数反转到前面例: [1,2,3,4,5,6,7],k=3 → [5,6,7,1,2,3,4]def rotate_v1(array, k): array = array[:] n = len(array) for i in range(k): temp = array[n - 1] for j ... 阅读详情

相关推荐

草根创业团队的融资挑战

《草根创业团队的融资挑战》 关键词:融资、草根创业、风险投资、天使投资、股权融资、债务融资 摘要: 草根创业团队在初创和发展过程中常常面临融资挑战。本文将深入探讨草根创业团队在融资过程中的基础概念、策略

AI天才研究院 645

python学习笔记3-函数

函数: 创建方法: def 函数名(参数): 函数体 例子: def hello(name): return 'hello.'+name 例子(输出斐波那契数列): def fib(num): result=[0,1] for i in range(num-2): result.append(result[-2]+result[-1]) return result print(fib(10)) 结...

qq_35488769的博客 1687

五段式S型算法笔记

又因为有 v-v0= 0.5jt通式: 所以有 vm-v0= 0.5jtm 所以有4vm-4v0= 2jtm。算法1: v=2vm-v0-0.5*jt+2jt*tm-2jtm*tm。加加速度j 自己设置 已知,vmax自己设置已知;所以有4vm-4v0= 2jtm带入算法1。

qq_36658033的博客 680

result.append(path[:]) 和 result.append(path) 之间的区别

result.append(path[:]): 这样使用切片操作创建了 path 列表的浅拷贝,然后将拷贝后的列表添加到 result 中。这样,result 中存储的是一个新的列表对象,而不是 path 的引用。在许多情况下,特别是在处理树形结构等递归问题时,使用 path[:] 是一个常见的技巧,以确保每个路径的副本都是独立的,不受后续修改的影响。result.append(path[:]) 和 result.append(path) 之间有一个重要的区别,这涉及到对列表的浅拷贝。

nebula1008的博客 1129

YOLOv8傻瓜式教程

YOLOv8傻瓜式教程,附带详细参数配置。

Father_of_Python的博客 1万+

【大模型】大模型知识蒸馏 综述解读(Knowledge Distillation of Large Language Models)

知识蒸馏的(论文)方法总结。归纳了通过数据(如指令、对话、多模态)和训练方法(SFT、RL、数据增强),将复杂技能(如对齐、工具使用、多模态)蒸馏到开源模型的核心框架,附典型模型示例(如Alpaca、LLaVA)。

songxia928_928的博客 4334

python高级特性浅谈

1、集合的推导式 •列表推导式,使用一句表达式构造一个新列表,可包含过滤、转换等操作。 语法:[exp for item in collection if codition] if codition - 可选 •字典推导式,使用一句表达式构造一个新列表,可包含过滤、转换等操作。 语法:{key_exp:value_exp for item in collection if codition} •集合推导式 语法:{exp for item in collection if co

baidu_27791019的博客 611

别再硬编码了!Flowable工作流动态审批人配置全解析(Spring Boot集成版)

本文深入解析Flowable工作流在Spring Boot中的动态审批人配置技术,通过角色、部门等变量实现审批流程的灵活设计。文章详细介绍了架构原理、前端配置映射、动态候选组解析及查询优化方案,帮助企业提升审批流程的适应性和维护效率。

weixin_30919571的博客 133

草根学Python(一)第一个Python程序

前言一时冲动,就开始把 Python 的知识点做个总结归纳了。gitbook 同时更新。目录一、Python 简介Python 是著名的“龟叔” Guido van Rossum 在 1989 年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。牛人就是牛人,为了打发无聊时间竟然写了一个这么牛皮的编程语言。现在,全世界差不多有 600 多种编程语言,但流行的编程语言也就那么 20 来种。不知道你

GitHubClub 2220

innovus中如何设置cts参数

上面是设置cts的一般设置,如果需要对某些skew group或者某些clock tree设置不一样的参数,如需要对clk1这个clock设置不一样的inverter,可以使用。需要查询已经设置过的ccopt参数,可以使用get_ccopt_property去查询,方法和set_ccopt_property一致。言归正传,cts的设置命令是set_ccopt_property,获取命令是get_ccopt_property。另外,set_ccopt_property提供一套命令查询方法。

芯冰乐 543

机器学习的低代码与无代码平台:便捷入门之路

机器学习领域正涌现出大量低代码和无代码平台,使非技术人员也能轻松应用AI技术。低代码平台(如PyCaret、H2O AutoML)需少量编程但灵活性强,而无代码工具(如Google Cloud AutoML、Teachable Machine)则完全无需编程基础。这些平台覆盖图像识别、文本处理、业务预测等多种场景,适合快速部署简单项目。但专业人士仍需注意,这些工具无法替代复杂场景下的定制化开发。随着技术进步,低门槛AI工具正在改变各行业的创新方式。

2501_90323865的博客 154

一个初学编程的草根大叔用了一个月时间冲上周榜第二名!给想冲榜的后浪们谈谈小经验——

今晨起来翻了翻CDSN排行榜,发现前天发的文章早已被挤出全站热榜,但却发现自己站上了作者周榜的亚军宝座。

汉阳Hann's Home 1万+

【AI智能体】Hermes Agent 从部署到项目实战操作详解

Hermes Agent 桌面版从安装到实战操作详解

congge 5130

草根学Python(十二)元类

前言第十二篇了,撸起袖子,就是干。目录一、Python 中类也是对象在了解元类之前,我们先进一步理解 Python 中的类,在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在 Python 中这一点也是一样的。class ObjectCreator(object): pass mObject = ObjectCreator() print(mObject)输出结果:<__ma

GitHubClub 1267

C# 量子级跨平台开发:用Uno Platform实现Windows、iOS、Android的“量子纠缠”UI同步

墨瑾轩推出编程学习平台,通过XAML的“量子纠缠”技术,实现跨平台开发的高效与一致性。传统方案中,多平台代码重复率高,UI差异大,而量子级方案则通过一套代码构建全平台应用,UI原子化同步,开发效率提升5倍。Uno Platform的“量子纠缠”架构解决了代码碎片化、性能瓶颈和调试难题,实现UI原子化同步、性能提升300%和跨平台数据无缝同步。核心架构包括XAML的跨平台渲染、MVVM的量子叠加态架构、平台差异的量子退相干处理以及性能优化的量子隧穿效应,为开发者提供高效、一致的跨平台开发体验。

java专栏 1165

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

草根学Python(四) Dict 和 Set

前言上一篇文章出现了个明显的知识点错误,不过感谢有个网友的提出,及时进行了修改。也希望各位多多包涵。新建了一个 Python 学习讨论的微信群,如果有兴趣的童鞋们,加群讨论下吧。也可以加我个人微信,拉你进群目录一、字典(Dictionary)经过之前的学习,我们可以知道 list 和 tuple 可以用来表示有序集合,之前我们那个例子是用 list 来存储了用户的昵称user=['liangdian

GitHubClub 2607

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

草根学Python(九) 面向对象

前言这篇写的很纠结,不过还是写完了。弄了个很逊的公众号,如果对本文有兴趣,可以关注下公众号喔,会持续更新。目录一、面向对象的概念Python 是一门面向对象的语言, 面向对象是一种抽象,抽象是指用分类的眼光去看世界的一种方法。 用 JAVA 的编程思想来说就是:万事万物皆对象。也就是说在面向对象中,把构成问题事务分解成各个对象。面向对象有三大特性,封装、继承和多态。1、面向对象的两个基本概念 类 用

GitHubClub 1278

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

草根学Python(十四) 一步一步了解正则表达式

目录初识 Python 正则表达式正则表达式是一个特殊的字符序列,用于判断一个字符串是否与我们所设定的字符序列是否匹配,也就是说检查一个字符串是否与某种模式匹配。Python 自 1.5 版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。下面通过实例,一步一步来初步认识正则表达式。比如在一段字符串中寻找是否含有某个字符或某些字符

GitHubClub 1333

草根学Python(三) List 和 Tuple

前言继续更新,可以通过 https://www.readwithu.com/ 来看之前的文章。目录一、List(列表)Python 内置的一种数据类型是列表:list。 list 是一种有序的集合,可以随时添加和删除其中的元素。1、创建 List(列表)创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可,且列表的数据项不需要具有相同的类型list1=['两点水','twowter','l

GitHubClub 2739

草根学Python(十三)线程和进程

前言拖了好久,不过还是得坚持。喜欢本文的话可以加下公众号【于你供读】。目录线程与进程线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程。操作系统会为这些进程分配一些执行资源,例如内存空间等。在进程中,又可以创建一些线程,他们共享这些内存空间,并由操作系统调用,以便并行计算。我们都知道现代操作系统比如 Mac OS X,UNIX,Linux,Windows 等可以同时运行多个任

GitHubClub 953

Python系列教程(入门系列已写完)

IT 行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰,但是,我们要清楚:淘汰的永远只是那些初级水平的从业者,过硬技术的从业者永远都是稀缺的。因此对于学习,我们还是要踏踏实实的。 自学 Python ,也是一样,不要一开始因为头脑发热就不停地收藏各种资料网站,购买各种书籍,下载了大量的教学视频,过了几天,学习的热情开始褪去,再过几个星期,终于完成了学习课程 —— 《...

Java干货 699

草根学Python(十)Python 的 Magic Method

前言距离上一篇已经三个多星期了,最近比较累,下班回到家,很早就休息了,所以更新的进度有点慢。目录一、Python 的 Magic Method在 Python 中,所有以 “__” 双下划线包起来的方法,都统称为”魔术方法”。比如我们接触最多的 __init__ 。魔术方法有什么作用呢?使用这些魔术方法,我们可以构造出优美的代码,将复杂的逻辑封装成简单的方法。那么一个类中有哪些魔术方法呢?我们可以使

GitHubClub 1516

草根学Python(十六) 装饰器(逐步演化成装饰器)

上一篇文章将通过解决一个需求问题来了解了闭包,本文也将一样,通过慢慢演变一个需求,一步一步来了解 Python 装饰器。 首先有这么一个输出员工打卡信息的函数: def punch(): print('昵称:两点水 部门:做鸭事业部 上班打卡成功') punch() 输出的结果如下: 昵称:两点水 部门:做鸭事业部 上班打卡成功 然后,产品反馈,不行啊,怎么上班打

GitHubClub 1253
上一篇: 草根学Python(五) 条件语句和循环语句
下一篇: 草根学Python(七) 迭代器和生成器
Two_Water
博客等级 码龄12年 573粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值