前言

python的最大特点就是dynamically typed就是动态类型,不像java需要定义数据类型

引入

先从一段代码引入:

1

2

3

4

5

6

7

8

9

10class Dog():

def __init__(self,name,age):

self.name=name

self.age=age

def getName(self):

return self.name

dog=Dog('name',16)

print(dog.getName())

别急,我们先学习下py的函数,这个形式跟C以及java等语言有点不一样。跨度有点大,对于刚接触来说,我们需要对比一下。

自定义函数

先来看一个例子

1

2

3

4

5def my_func(message):

print('Got a messag: {}'.format(message))

my_func('hello world')

#这里其实我有个地方不是很懂,不过大约能够知道什么意思,就是{}用来占位,记得在java中log常常这么用

大致形式

1

2

3def 函数名(参数):

处理

return/yeild

与其他语言不一样的是,def是可执行语句,即函数被调用前,都是不存在的,直到被调用的时候才会创建一个新的函数对象,并赋予其名字

对于以上这段话不理解的我们需要对比以下代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14hello()

def hello():

print('hello')

return

#报错,在主程序里,函数要先于调用前的定义

def my_func():

hello()

return

def hello():

print('hello')

return

my_func()

#正常运行,因为def是可执行语句,在调用的时候都不存在,但是我们必须保证调用前都已经声明定义了

注:我们先有个全局的概念,然后我们在看一下细节

我们深入来看一个代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15def my_func(l):

if not isinstance(l,list):

print('what you input is not a list')

return

if len(l)==0:

print('waht you input is empty')

return

largest=l[0]

for item in l:

if item>largest:

largest=item

print('the largest item in l is {}'.format(largest))

return

my_func([8,-1,0,2])

多态

看到这个我真的哭了,这里的多态完全跟java不同

1

2

3

4

5

6

7def my_sum(a,b):

print(a+b)

return

my_sum(1,2)

my_sum([1,2],[3,4])

my_sum('hello','world')

#对于这种来什么就接受什么的函数,必要时需要在前面进行类型检查

函数变量的作用域1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27MAX_VALUE=100

def test1(value):

global MAX_VALUE

MAX_VALUE=value

print(MAX_VALUE)

return

def test2(value):

MAX_VALUE=value

print(MAX_VALUE)

return

def test3():

print(MAX_VALUE)

return

test3()

test2(1)

test3()

test1(1)

test3()

----

输出结果:

100

1

100

1

1

分析一下:

函数内部默认为局部变量,即当函数调用结束后(return),该变量会被收回,并且不能够被访问

Python的全局变量定义在主程序中

函数可以调用全局变量,如果用更改全局变量的时候需要 global关键字,这里并不是重新创建一个新的变量,而是告诉Python 解释器,这里的变量就是之前定义的全局变量

如果函数内部的变量名与主程序的变量名重名,那么局部变量将覆盖全局变量

现在我们基本上了解了python的函数基本规则,我们回到类

1

2

3

4

5

6

7

8

9

10class Dog():

def __init__(self,name,age):

self.name=name

self.age=age

def getName(self):

return self.name

dog=Dog('name',16)

print(dog.getName())

在这里我们对比java的dog类如何去定义

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17public class Dog{

private String name;

private int age;

Dog(String name,int age){

this.name=name;

this.age=age;

}

String getName(){

return this.name;

}

public static void main(String...ags){

Dog dog=new Dog("name",16);

System.out.println(dog.getName());

}

}

这两段代码执行的效果是一样的。

区别:

python不需要提前声明的类的属性,因为不要指明属性的数据类型

Python的构造函数不是以类名,虽然调用的时候是以类名,说明在声明定义该类的对象的时候,会自动调用Init函数

注意到python的每个函数里面都有一个变量self,但是在调用的时候又不需要传入该参数,你可以看到这个self的作用跟this的作用差不多,只不过在python中必须使用这个self,在每一个类的方法中,self总是指向当前的实例,在init函数中self指向的最新被创建的对象,在其他函数中,指向调用该方法的对象

1

2

3

4

5

6

7

8

9

10

11

12

13

14class Dog():

def __init__(self,name,age):

self.__name=name

self.age=age

self.__sex='boy'

def getName(self):

return self.__name

dog=Dog('name',16)

dog.__name='Name'

print(dog.__name)

print(dog.getName())

print(dog.__sex)

注:在一次被python的数据定义给坑了

首先我们注意到java里面数据是由private属性的,那么在python中默认以两个下划线表示该属性为私有属性,不可被对象之间调用

但是如果dog.__name记住这里的name属性不是该类的属性,而是你给dog这个变量重新定义的一个,与类里定义的不同

接着我们深入了解面向对象里面的细节,先来看一下下面这段代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28class Dog():

MAX_AGE=16

def __init__(self,name,age):

self.name=name

self.age=age

@classmethod

def newName(cls,name):

cls.name=name

return

def getName(self):

return self.name

@staticmethod

def get_MAX_AGE(age):

if age

print("the dog age is {}".format(age))

return

else:

print('the maxage is {}'.format(Dog.MAX_AGE))

return

dog=Dog('NAME',14)

print(dog.getName())

dog.newName('name')

print(dog.getName())

dog.get_MAX_AGE(16)

第一个MAX_AGE是类中定义的常量,可以通过self.MAX_AGE或者Entity.MAX_AGE调用

注意到 @classmethod和@staticmethod 我们已经将类中的函数区别开来了,首先是classmethod类函数,能够动态访问或者修改对象的属性,其第一个参数一般为cls,最常用的功能是实现不用的init构造函数(好吧,上述代码不具有参考意义) ,@staticmehod是静态函数,可以用来做一些简单独立的任务,像什么测试等等,最后就是成员函数,是最正常的函数,不需要任何声明,第一个self代表当前对象的引用

写到最后

这样,已经大致的会写python的类了,但是面向对象里面还有个重要的思想就是继承。不过这个留到后面来深入。当前我的目标就是对python基础有个全貌的了解。

python自定义函数func_python自定义函数与面向对象相关推荐

  1. 在python中使用关键字define定义函数_python自定义函数def的应用详解

    这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数 自定义函数,编程里面的精髓! def 自定义函数的必要函数:def 使用方法:def 函数名(参数1,参数2,参数-): ...

  2. Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式)、使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等)

    Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式).使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等) 目 ...

  3. python调用自己写的函数_python调用自定义函数的实例操作

    在python中,想要调用自定义函数必须先声明,然后才能调用.使用函数时,只要按照函数定义的形式,向函数传递必需的参数,就可以调用函数完成相应的功能或者获得函数返回的处理结果. (1)声明函数 pyt ...

  4. python学习笔记之自定义函数

    live long and prosper 自定义函数 def greet_user():"""现实简单的问候语"""print(" ...

  5. 一文弄懂python中的函数(自定义函数,匿名函数,高阶函数与解析式)

    什么是函数,如何在 Python 程序中定义函数呢? 说白了,函数就是为了实现某一功能的代码段,只要写好以后,就可以重复利用. python中的自定义函数 Python 的函数具有非常灵活多样的参数形 ...

  6. Python爬虫笔记——def()自定义函数的几种参数

    Python自定义函数是以def开头,空一格之后是这个自定义函数的名称,名称后面是一对括号,括号里放置形参列表,结束括号后面一定要有冒号":",函数的执行体程序代码也要有适当的缩排 ...

  7. Python之系统函数、自定义函数、模块、递归合集

    一.函数(function)引入 1.函数(计算机函数)是程序中一段相对独立的代码,这段代码能够实现某一项具有独立.完整的功能.指可以直接被另一段程序代码引用的程序代码. 2.函数分为系统函数和自定义 ...

  8. 洗礼灵魂,修炼python(21)--自定义函数(2)—函数文档,doctest模块,形参,实参,默认参数,关键字参数,收集参数,位置参数...

    函数文档 1.什么是函数文档: 就是放在函数体之前的一段说明,其本身是一段字符串,一个完整的函数需要带有函数文档,这样利于他人阅读,方便理解此函数的作用,能做什么运算 2.怎么查看函数文档: func ...

  9. python中func自定义函数_Python函数之自定义函数作用域闭包

    一 前言 1.1 为什么要用函数 代码的组织结构更清晰,可读性好: 遇到重复的功能不需要重新编写代码,调用函数即可,代码不会冗余: 功能需要扩展时,只需要修改函数内容即可,实现统一管理,降低代码维护难 ...

最新文章

  1. Day4 python基础
  2. C++ dlopen mini HOWTO 一篇非常好的介绍C++ dlopen linux/mac os x 编程的资料
  3. Hive更换TEZ引擎
  4. Vue封装下拉框组件时,为document绑定原生事件addEventlistener(click“),切换页面之后事件还未被摧毁...
  5. linux 管道 top,linux IPC总结——管道
  6. ./mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No suc
  7. python输入框输入提交_python文本文件处理和用户输入
  8. python实践统计学中的三大相关性系数,并绘制相关性分析的热力图
  9. 非常有意思的35句话
  10. 知识蒸馏 | 知识蒸馏的算法原理与其他拓展介绍
  11. vue_elementui拖住滑块拼图验证代码
  12. 设置美团用户cookie实现用户登录
  13. vue实现动态二维码完成签到功能
  14. OHS 12C中导入第三方SSL证书
  15. 华为鸿蒙与小米新系统,华为鸿蒙系统硬刚谷歌!小米也发布新系统:却选择和谷歌系统互补...
  16. 暗斑怎么形成的_脸上长暗斑详解
  17. 青龙扩展--九章头条
  18. Grafana自定义报警
  19. 华为云硬盘备份(VBS)服务
  20. ESIM(Enhanced Sequential Inference Model)- 模型详解

热门文章

  1. 计算机应用技术面试的礼仪和技巧,远程复试下,这些面试礼仪一定要注意!
  2. linux用java连接mysql_Java使用JDBC方式连接数据库
  3. 水星怎么设置网速最快_水星无线路由器如何设置网速限制 水星路由器怎么让别人网速限制方法...
  4. python opencv2_Python + OpenCV2 系列:2 - 图片操作
  5. php异步方案,php 伪异步执行实现方法
  6. 求一个向量变换为另一个向量的矩阵_OpenGL里旋转等变换矩阵为什么是4x4的矩阵...
  7. ll微信2下载安装_【兰苑文学】:陈振 ll黄金槐
  8. 编译原理语法分析_斯坦福大学《编译原理》学习记录 - 第二章:语法分析器
  9. 如何设置win7系统分辨率
  10. 高并发之服务降级和服务熔断____服务降级、熔断、限流的区别