python 函数0一(初识函数)

读书目录

为何要用函数

函数的定义和调用

函数的再次来到值

函数的参数

小结

 

前言

苹果在IOS7过后给导航控制器扩充了3个Pop的手势,只要手指在显示屏边缘滑动,当前的控制器的视图就会尾随你的指头运动,当用户放手后,系统会咬定手指拖动出来的大大小小来决定是不是要履行控制器的Pop操作。

图片 1

nav_pop_origin.gif

以此操作的想法格外好,可是系统给咱们明确的界定必须是显示屏左边边缘才能够触发,那样事实上行使进度中对于有些产品会发生不便,于是某些app就应用百分百显示器都响应那几个手势并且pop动画仍然用系统原生的,那样操作起来着实有益广大。

图片 2

nav_pop_custom.gif

开班大家一定会卓殊,给控制器的View加个手势然后拖动控制器的View时改变它的frame不就足以了啊?没错,加手势这一个想法是科学的。然而,由咱们友好来改变控制器视图的地点是相比较费力的,细心的敌人肯定发现了,大家自定义pop手势上面的导航栏也是在随着你的手势拖拽而改变的,所以那样做还索要承担导航栏的卡通,而且有3个主要难点,借使单独拖动view,这些view上面会是黑黑的一片,因为控制器的push和pop层级是由系统管理的。

图片 3

nav_pop_failed.gif

由此走那条路固然能够,但达成起来会比较劳苦。那么,怎么着促成那么些职能啊?前日就给大家提供两套实现方案。


[1]

干什么要用函数

近期python届产生了一个大事件,len方法突然不能够一直用了。。。

接下来现在有二个须要,让你总计’hello world’的长度,你怎么总结?

本条必要对于当今的你其实简单,大家壹并来写一下。

图片 4图片 5

s1 = "hello world"
length = 0
for i in s1:
    length = length+1

print(length)

for循环落成len作用

好了,效率完毕了,分外健全。然后今后又有了一个急需,要计算此外一个字符串的长短,”hello
eva”.

于是乎,那个时候你的代码就改为了那样:

图片 6图片 7

图片 8

s1 = "hello world"
length = 0
for i in s1:
    length = length+1

print(length)

s2 = "hello eva"
length = 0
for i in s2:
    length = length+1

print(length)

图片 9

for循环达成len成效二

诸如此类确实能够落成len方法的功用,可是总感觉不是那么完美?为啥吗?

率先,以前假诺大家实行len方法就能够直接得到叁个字符串的长短了,现在为了兑现平等的效益大家把相同的代码写了成都百货上千遍
—— 代码冗余

协理,从前我们只写两句话读起来也很不难,一看就驾驭那两句代码是在盘算长度,不过刚刚的代码却不那么简单读懂
—— 可读性差

print(len(s1))
print(len(s2))

我们就想啊,假若我们能像使用len1样使用大家这一大段“总括长度”的代码就好了。那种感觉有点像给那段代码起了叁个名字,等大家用到的时候一贯喊名字就能执行那段代码似的。倘若能这么,是否很周到啊?

回到顶部

方案1:自定义UIViewControllerInteractiveTransitioning对象,完结导航控制器代理方法。

那么些是苹果官方推荐的做法,在WWDC 2013 218 – Custom Transitions Using
View
Controllers
中有证实。

那套方案固然达成比较麻烦,可是动画相对灵活,你能够达成这样的机能,

图片 10

nav_pop_cube.gif

也得以有那种意义。

图片 11

nav_pop_flip.gif

实际上那些拖动进度属于导航控制器的卡通,所以大家要求重写UINavigationController的七个代理方法,navigationController:animationControllerForOperation:fromViewController:toViewController:(名字十分长下边就称为方法一)和
navigationController:interactionControllerForAnimationController:(方法2)。
解释一下他们的法力,方法一是苹果提要求大家用来重写控制器之间转场动画的(pop或然push)。方法二你能够这么敞亮,苹果让大家回来四个相互的靶子,用来实时管控器之间转场动画的完结度,通过它大家得以让控制器的转场动画与用户交互(注意一点,若是方式一赶回是nil,方法二是不会调用的,也正是说,只有我们自定义的动画才足以与控制器交互)。

下边大家来看一下降实进度。为了便利大家驾驭,笔者会尽量在德姆o中的注释写的最清晰明了。
并且,我们先用最简易的代码完成,在这篇文章的末梢作者会对本例中的德姆o提供一个争持合理的写法。

第3在章程第11中学,我们回到3个死守了UIViewControllerAnimatedTransitioning协议的对象,它便是自定义的动画片对象,大家给它起名PopAnimation,在那个类中落实五个章程来自定义转场动画。

图片 12

显示屏快速照相 20一伍-03-2八 早晨6.4玖.0五.png

再来看方法二,大家必要回到四个死守了UIViewControllerInteractiveTransitioning协议的对象(提醒一下,那四个探讨不难模糊,要留心区分,3个是负担动画,2个是负担交互进度),苹果已经有四个类专门处理这么些效用,它叫UIPercentDrivenInteractiveTransition,当然你也足以自定义二个如此的类。大家得以这样精通它的效益:后边在情势第11中学回到的卡通,会在推行的进程中被系统一分配解以用于用户交互,这些互动进程的卡通片达成度就由它来调节和控制。下边大家来看一下什么样运用它。(为了让控制器视图拖动,大家给控制器的视图加了三个拖入手势,在拖动方法里大家对那个指标开始展览操作)

图片 13

显示屏快照 二零一六-03-2九 早上12.3叁.5九.png

最后在视图控制器里重写导航栏的八个点子。

图片 14

显示器快速照相 20一5-0叁-2玖 早上1贰.叁7.5一.png

有两点并非忘记:

  1. 安装导航控制器的代办为当前控制器。
  2. 给控制器加手势。

OK,那样大家就形成了这些进程。

图片 15

nav_pop_own.gif


[2]

初识函数定义与调用

今后就教大家三个既能,让你们把代码装起来。

图片 16图片 17

def mylen():
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    print(length)

View Code

大家联合来分析一下这段代码做了何等。

实则除了def那一行和后面包车型大巴缩进,别的的接近正是正规的进行代码。大家来施行一下,哦,好像啥也没发出。

恰恰大家曾经说过,这是把代码装起来的长河。你未来只会往里装,还不会往出拿。那么应该怎么往出拿呢?作者来报告大家:

mylen()

是或不是很简短?是还是不是似曾相识?那正是代码取出来的进度。刚刚我们就写了一个函数,并且成功调用了它。

图片 18图片 19

图片 20

#函数定义
def mylen():
    """计算s1的长度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    print(length)

#函数调用  
mylen()

图片 21

函数的定义和调用

总结一:

定义:def
关键词开始,空格之后接函数称谓和圆括号(),最后还有一个”:”。

   def
是原则性的,不可能变,必须是接贰连三的def三个字母,不可能分开。。。它们要密切相爱的在一块儿。

   空格
为了将def关键字和函数名分别,必须空(4声),当然你能够空二格、三格依然您想空多少都行,但符合规律人照旧空1格。

   函数名:函数名只好分包字符串、下划线和数字且不能够以数字开始。即使函数名能够任由起,但大家给函数起名字或然要尽量简单,并能表达函数功用

   括号:是必须加的,先别问为啥要有括号,由此可知丰裕括号就对了!

注释:每三个函数都应有对职能和参数进行相应的求证,应该写在函数上面第一行。以增加代码的可读性。

调用:就是 函数名() 要记得加上括号,好么好么好么。

回到顶部

方案二:Runtime+KVC

要询问这样的做法,必要有Runtime的部分文化,会波及到个体变量、私有方法的取得,但是那样做相比简单也比较有意思,假若您感兴趣就延续看下来吗。关于Runtime的知识,以往笔者会分享到博客里,朋友们敬请期待。

为了便利我们阅读上面包车型大巴代码,大家须求先了然系统的这一个手势。

前面大家理解到,那些手势属于UINavigationController,咱们就跳到它的头文件里看望能还是无法找到线索。那几个思路是毋庸置疑的,确实有一个手势叫做interactivePopGestureRecognizer。属性为readonly,就是说我们不能够给他换来自定义的手势,不过足以设置enable=NO。ok,既然找到了它,就打印一下看看它到底是贰个怎么着手势。

图片 22

显示屏快速照相 20一五-0三-二陆 早晨伍.一7.3伍.png

通过log,我们见到她属于UIScreen艾德gePanGestureRecognizer这几个类(从前笔者是未曾用到过),它继续自UIPanGestureRecognizer,现身在IOS七过后,是专门处理在显示屏边缘触发的手势类型,并且唯有二个天性叫edges,用来设置它的接触边缘(上、下、左、右、全部)。看到此间壹些有情人会想,直接改它的edges为全体好还是倒霉?经过试验领会到,改这几个个性是没用的,它只可以用来触发边缘,设为全部的意味是多少个样子的边缘会触发,而且用来做控制器POP手势的唯有左侧缘。

大家继续看它的log。控制台除了打字与印刷了它的类,还打字与印刷了它的触发target:_UINavigationInteractiveTransition(那是1个私有类,看来是专门用来做导航控制器交互动画的),和action:handleNavigationTransition(那是它的二个私家方法),咱们要做的就是新建三个UIPanGestureRecognizer,让它的触发和系统的这么些手势相同,那就必要运用runtime获取系统手势的target和action。

那么怎么样赢得那么些target呢?一起始本人用kvc想直接获取那些手势的target,程序崩溃了,原来它根本未曾那样二性子质。所以自个儿能想到的是,先利用runtime遍历它的保有成员变量,看看系统是怎么存款和储蓄那个性子的,

图片 23

显示器快速照相 20一五-0三-2九 深夜三.贰5.0二.png

通过log我们能够看到,UIGestureRecognizer有三个叫_targets的性格,它的项目为NSMutableArray。

图片 24

显示器快速照相 20一伍-03-2九 清晨三.贰5.0九.png

它是用数组来储存每二个target-action,所以能够动态的充实手势触发对象。那么又是何许存款和储蓄每二个target-action呢?为了打探那些我们得到那特特性的名字”_targets”通过kvc获取它,接着打字与印刷出来。

图片 25

显示器快照 20一5-03-2九 中午三.3三.5肆.png

图片 26

显示器快照 20一伍-0三-2玖 晚上三.3肆.0一.png

能够观察,由于系统重写了它的description方法,所以我们不能通过打字与印刷获取这一个指标是怎样品种。既然不能够打字与印刷,那么大家就用断点调节和测试,来看它的实在类型,

图片 27

显示器快速照相 20一伍-0三-2玖 清晨叁.三柒.3二.png

咱俩来看,原来每贰个target-action是用UIGestureRecognizerTarget那样3个类来存款和储蓄的,它也是三个私有类。
苹果把广大的类做私有化也是有缘由所在,其实在日常大家获得这么些类也是绝非用的,他们的目标之壹是制止对开发者公开无用的类,影响了封装性。所以在类的安顿性上,依旧要向苹果学习。

下边直接看代码。

我们在控制器的ViewDidLoad加上那段代码,并且它只须求履行3回。

图片 28

显示屏快速照相 20一5-0三-2九 早晨四.0柒.48.png


函数的重回值

正巧大家就写了二个函数,那几个函数能够支持大家总括字符串的尺寸,并且把结果打字与印刷出来。可是,那和我们的len方法还不是太相同。哪个地方不等同吗?此前笔者们调用len方法会得到贰个值,大家务必用一个变量来收纳这些值。

str_len = len('hello,world')

这个str_len正是‘hello,world’的长度。这我们自身写的函数能成功这点么?大家也来试一下。

图片 29图片 30

图片 31

#函数定义
def mylen():
    """计算s1的长度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    print(length)

#函数调用
str_len = mylen()
print('str_len : %s'%str_len)

图片 32

函数调用的结果

很不满,假如你执行这段代码,得到的str_len
值为None,那表达我们那段代码什么也远非给你回去。

那如何让它也想len函数1样再次回到值呢?

图片 33图片 34

图片 35

#函数定义
def mylen():
    """计算s1的长度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    return length

#函数调用
str_len = mylen()
print('str_len : %s'%str_len)

图片 36

View Code

我们只须求在函数的结尾加上一个return,return前边写上您要回来的值就足以了。

接下去,我们就来商量一下以此return的用法。

return关键字的效果

  return
是3个关键字,在pycharm里,你会看到它变成品蓝了。你不能够不一字不差的把这一个单词给背下来。

  这些词翻译过来正是“重临”,所以我们管写在return前面包车型客车值叫“重回值”

要商讨重返值,大家还要精通再次回到值有几种景况:分别是一直不再次来到值、再次回到2个值、再次来到五个值

从未再次回到值

  不写return的动静下,会暗许再次来到二个None:大家写的率先个函数,就不曾写return,那正是尚未重回值的1种状态。 

图片 37图片 38

图片 39

#函数定义
def mylen():
    """计算s1的长度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    print(length)

#函数调用
str_len = mylen()
#因为没有返回值,此时的str_len为None
print('str_len : %s'%str_len)

图片 40

不写return  

  只写return,前面不写其余剧情,也会回到None,有的同学会奇怪,既然未有要回到的值,完全能够不写return,为啥还要写个return呢?那里大家要说一下return的此外用法,就是如果遇上return,截止全部函数。  

图片 41图片 42

图片 43

def ret_demo():
    print(111)
    return
    print(222)

ret = ret_demo()
print(ret)

图片 44

只写return

      return None:和下边的三种处境一模壹样,大家1般不这么写。

图片 45图片 46

图片 47

def ret_demo():
    print(111)
    return None
    print(222)

ret = ret_demo()
print(ret)

图片 48

return None

重回四个值

     
刚刚大家早就写过3个回到1个值的境况,只需在return后边写上要重临的内容即可。  

图片 49图片 50

图片 51

#函数定义
def mylen():
    """计算s1的长度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    return length

#函数调用
str_len = mylen()
print('str_len : %s'%str_len)

图片 52

回来1个值

  留意:return和重返值之间要有空格,能够回来任意数据类型的值

回来四个值

  能够回来任意多少个、任意数据类型的值

图片 53图片 54

图片 55

def ret_demo1():
    '''返回多个值''' 
    return 1,2,3,4


def ret_demo2():
    '''返回多个任意类型的值'''
    return 1,['a','b'],3,4

ret1 = ret_demo1()
print(ret1)
ret2 = ret_demo2()
print(ret2)

图片 56

归来多个值

  重临的四个值会被公司成元组被重返,也能够用多少个值来接受

图片 57图片 58

图片 59

def ret_demo2():
    return 1,['a','b'],3,4

#返回多个值,用一个变量接收
ret2 = ret_demo2()
print(ret2)

#返回多个值,用多个变量接收
a,b,c,d = ret_demo2()
print(a,b,c,d)

#用多个值接收返回值:返回几个值,就用几个变量接收
a,b,c,d = ret_demo2()
print(a,b,c,d)

图片 60

四个重返值的收受

 

  原因:  

>>> 1,2  #python中把用逗号分割的多个值就认为是一个元组。
(1, 2)
>>> 1,2,3,4
(1, 2, 3, 4)
>>> (1,2,3,4)
(1, 2, 3, 4)

图片 61图片 62

图片 63

#序列解压一
>>> a,b,c,d = (1,2,3,4)
>>> a
1
>>> b
2
>>> c
3
>>> d
4
#序列解压二
>>> a,_,_,d=(1,2,3,4)
>>> a
1
>>> d
4
>>> a,*_=(1,2,3,4)
>>> *_,d=(1,2,3,4)
>>> a
1
>>> d
4
#也适用于字符串、列表、字典、集合
>>> a,b = {'name':'eva','age':18} 
>>> a
'name'
>>> b
'age'

图片 64

队列解压扩张

 

归来顶部

优化

本条demo笔者会提供给大家,上面不难说下程序的优化思路。

  • 优化点一:对于方案1,其实不该把导航控制器的代办方法以及手势处理的艺术交给视图控制器,因为那段代码不是属于某贰个视图控制器,而是全局的领航控制器,所以大家相应参照苹果的设计思想:新建叁个专程管理互相进程的靶子,那些类大家誉为NavigationInteractiveTransition。

  • 优化点2:再来看后面包车型地铁ViewDidLoad中只进行二次的代码,其实写在此间也不够稳妥,同样的,那段代码也不属于某1个Controller,优化方案是新建二个导航控制器,在那些导航控制器的viewDidLoad中写上那一个代码,那样也并不必要dispatch
    once。

  • 优化点3:由于我们自定义的手势是加在八个私人住房view上,这几个view是3个大局的,所以当这几个控制器为根控制器时,大家的手势照旧在起效果,那就也就是对根控制器做了pop操作,那会冒出3个破绽百出nested
    pop animation can result in corrupted navigation
    bar。导致那几个错误的原由还有四个,若是我们pop的卡通正在推行,再去接触三回手势,会促成导航控制器和导航条的动画混乱。为了制止难题应运而生我们须求变成手势的代办,判断当前控制器是还是不是为根控制器并且pop或然push动画是或不是在实践(那些变量是私有的,必要用kvc来获得)。

    图片 65
    显示器快速照相 20一伍-0叁-30 中午5.0六.二四.png

由此最终的优化,视图控制器能够怎么都不写,想使用这些意义,只要选拔大家自定义的导航控制器就能够了,那样的益处是手势动画与控制器完全解耦,并且永不给每八个控制器都addGesture。


给我们推荐贰个库房https://github.com/nst/iOS-Runtime-Headers,那个库房能够调取苹果的保有私有方法头文件,相当强大。

最后放上这么些demo的地址:https://github.com/zys456465111/CustomPopAnimation(使用时,切换工程的scheme就能切换分歧方案。对于方案贰,只需求导航控制器的类就足以了。)

感激大家,轻松学习系列还会继续下去,小编会尽量写出越来越多通俗易懂的稿子,让开发变得轻松起来?。

原稿链接:http://www.jianshu.com/p/d39f7d22db6c


[1]: 方案一。 

[2]: 方案二。 

函数的参数 

当今,大家已经把函数重回值相关的业务商量清楚了,大家团结壹度实现了2个足以回去字符串长度的函数。然则将来以此函数还是不到家,在此之前我们运用len函数的时候得是length
= len(“hello
world”),这样笔者得以想总括哪个人就总计何人的长度。可是今后大家写的这些函数,只可以总结二个“hello
world”的尺寸,换贰个字符串好像正是非凡了。那可如何做?

图片 66图片 67

图片 68

#函数定义
def mylen(s1):
    """计算s1的长度"""
    length = 0
    for i in s1:
        length = length+1
    return length

#函数调用
str_len = mylen("hello world")
print('str_len : %s'%str_len)

图片 69

带参数的函数

小编们报告mylen函数要总括的字符串是什么人,那么些进程就叫做
传送参数,简称传参,咱俩调用函数时传递的那么些“hello
world”和定义函数时的s一便是参数

实参预形参

参数还某个:

作者们调用函数时传递的那一个“hello
world”被称作实际上参数,因为这么些是实际上的要交给函数的情节,简称实参。

概念函数时的s一,只是一个变量的名字,被称为方式参数,因为在概念函数的时候它只是一个款式,表示那里有3个参数,简称形参。  

传递七个参数

参数能够传递多个,多个参数之间用逗号分割。

图片 70图片 71

def mymax(x,y):
    the_max = x if x > y else y
    return the_max

ma = mymax(10,20)
print(ma)

传送三个参数

也多亏因为必要传递多个参数、能够传递四个参数,才会有了背后那一密密麻麻参数相关的传说。。。

岗位参数

  站在实参角度

    一.依照职位传值

图片 72图片 73

图片 74

def mymax(x,y):
    #此时x=10,y=20
    the_max = x if x > y else y
    return the_max

ma = mymax(10,20)
print(ma)

图片 75

依据岗位传参

    贰.依据重点字传值

图片 76图片 77

图片 78

def mymax(x,y):
    #此时x = 20,y = 10
    print(x,y)
    the_max = x if x > y else y
    return the_max

ma = mymax(y = 10,x = 20)
print(ma)

图片 79

遵照重点字传参

    三.地方、关键字格局混着用

图片 80图片 81

图片 82

def mymax(x,y):
    #此时x = 10,y = 20
    print(x,y)
    the_max = x if x > y else y
    return the_max

ma = mymax(10,y = 20)
print(ma)

图片 83

职责、关键字混用传参

      正确用法

      难题1:地点参数必须在显要字参数的前边

      难题二:对于一个形参只可以赋值一遍      

  站在形参角度

    地点参数必须传值

图片 84图片 85

图片 86

def mymax(x,y):
    #此时x = 10,y = 20
    print(x,y)
    the_max = x if x > y else y
    return the_max

#调用mymax不传递参数
ma = mymax()
print(ma)

#结果
TypeError: mymax() missing 2 required positional arguments: 'x' and 'y'

图片 87

地方参数必须传参

默许参数

    一.正规使用

      使用格局

      为啥要有暗许参数:将转移比较小的值设置成私下认可参数

    二.默许参数的定义

图片 88图片 89

图片 90

def stu_info(name,sex = "male"):
    """打印学生信息函数,由于班中大部分学生都是男生,
        所以设置默认参数sex的默认值为'male'
    """
    print(name,sex)


stu_info('alex')
stu_info('eva','female')

图片 91

暗许参数

    三.参数陷阱:暗中同意参数是一个可变数据类型

图片 92图片 93

def defult_param(a,l = []):
    l.append(a)
    print(l)

defult_param('alex')
defult_param('egon')

参数陷阱

 

动态参数

  按任务传值多余的参数都由args统壹收取,保存成3个元组的方式

图片 94图片 95

图片 96

def mysum(*args):
    the_sum = 0
    for i in args:
        the_sum+=i
    return the_sum

the_sum = mysum(1,2,3,4)
print(the_sum)

图片 97

*args求和函数应用

图片 98图片 99

def stu_info(**kwargs):
    print(kwargs)
    print(kwargs['name'],kwargs['sex'])

stu_info(name = 'alex',sex = 'male')

**kwargs应用  

  实际开销中:

  今后还会用到的情景。。。

  问题:

    地点参数、默许参数、动态参数定义的依次以及收受的结果?

回来顶部

本章小结

面向进度编制程序的题目:代码冗余、可读性差、可扩充性差(不易修改)

概念函数的条条框框:

图片 100

1.定义:def 关键词开头,空格之后接函数名称和圆括号()。
2.参数:圆括号用来接收参数。若传入多个参数,参数之间用逗号分割。
    参数可以定义多个,也可以不定义。
    参数有很多种,如果涉及到多种参数的定义,应始终遵循位置参数、*args、默认参数、**kwargs顺序定义。
    如上述定义过程中某参数类型缺省,其他参数依旧遵循上述排序
3.注释:函数的第一行语句应该添加注释。
4.函数体:函数内容以冒号起始,并且缩进。
5.返回值:return [表达式] 结束函数。不带表达式的return相当于返回 None

def 函数名(参数1,参数2,*args,默认参数,**kwargs):
        """注释:函数功能和参数说明"""
        函数体
        ……
        return 返回值

图片 101

调用函数的规则:

图片 102

1.函数名()
    函数名后面+圆括号就是函数的调用。
2.参数:
    圆括号用来接收参数。
    若传入多个参数:
        应按先位置传值,再按关键字传值
        具体的传入顺序应按照函数定义的参数情况而定
3.返回值
    如果函数有返回值,还应该定义“变量”接收返回值
    如果返回值有多个,也可以用多个变量来接收,变量数应和返回值数目一致

无返回值的情况:
函数名()

有返回值的情况:
变量 = 函数名()

多个变量接收多返回值:
变量1,变量2,... = 函数名()

图片 103

参数总计:

图片 104

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图