精华内容
下载资源
问答
  • 查询表达式和条件表达式

    千次阅读 2019-09-15 16:20:31
    查询表达式 查询表达式可以作为过滤,分组,注解或者是聚合的一个值或者是计算。有很多内置表达式可以帮助你完成自己的查询。表达式可以组合,甚至是...这些表达式定义django.db.models.expressions和django.db....

    查询表达式

    查询表达式可以作为过滤,分组,注解或者是聚合的一个值或者是计算。有很多内置表达式可以帮助你完成自己的查询。表达式可以组合,甚至是嵌套,来完成更加复杂的计算

    内置表达式

    说明

    这些表达式定义在django.db.models.expressions 和django.db.models.aggregates中, 但为了方便,通常可以直接从django.db.models导入.

    F() 表达式

    class F

    一个 F()对象代表了一个model的字段值或注释列。使用它就可以直接参考model的field和执行数据库操作而不用再把它们(model field)查询出来放到python内存中

    使用update()方法批量地增加多个对象的字段值。这比先从数据库查询后,通过循环一个个增加,并一个个保存要快的很多。

    Reporter.objects.all().update(stories_filed=F('stories_filed') + 1)

    F() 表达式效率上的优点在于:

    • 直接通过数据库操作而不是python
    • 减少数据库查询次数

    使用 F() 避免竞态条件

    使用 F() 的另一个好处是通过数据库而不是Python来更新字段值以避免竞态条件.

    如果两个Python线程执行上面第一个例子中的代码,一个线程可能在另一个线程刚从数据库中获取完字段值后获取、增加、保存该字段值。第二个线程保存的值将会基于原始字段值;第一个线程的工作将会丢失。

    如果让数据库对更新字段负责,这个过程将变得更稳健:它将只会在 save() 或update()执行时根据数据库中该字段值来更新字段,而不是基于实例之前获取的字段值。

    在过滤器中使用 F()

    F() 在查询集过滤器中使用,使得条件通过字段值而不是python值过滤

    Reporter.objects.filter(pub_date=F('mod_date') )

    使用F()和注释

    通过将不同字段与算术集合在模型创建动态字段。

    company = Company.objects.annotate(
        chairs_needed=F('num_employees') - F('num_chairs'))

    如果组合字段是不同类型,需要告诉Django返回类型字段。

    from django.db.models import DateTimeField, ExpressionWrapper, F
    
    Ticket.objects.annotate(
        expires=ExpressionWrapper(
            F('active_at') + F('duration'), output_field=DateTimeField()))

    Func()表达式

    Func() 表达式是所有表达式的基础类型,包括数据库函数如 COALESCE 和 LOWER, 或者 SUM聚合.用下面方式可以直接使用:

    from django.db.models import Func, F
    
    queryset.annotate(field_lower=Func(F('field'), function='LOWER'))

    或者它们可以用于构建数据库函数库:

    class Lower(Func):
        function = 'LOWER'
    queryset.annotate(field_lower=Lower(F('field')))

    但是这两种情况都将导致查询集,其中每个模型用从以下SQL大致生成的额外属性field_lower注释:

    SELECT
        ...
        LOWER("app_label"."field") as "field_lower"

    Func API如下:

    class Func(*expressions**extra)

    function

    描述将生成的函数的类属性。具体来说,函数将被插入为模板中的函数占位符。默认为无。

    template

    类属性,作为格式字符串,描述为此函数生成的SQL。默认为'%(function)s(%(expressions)s)'。

    arg_joiner

    类属性,表示用于连接表达式列表的字符。默认为', '。

    *expressions参数是函数将要应用与表达式的位置参数列表。表达式将转换为字符串,与arg_joiner连接在一起,然后作为expressions占位符插入template。

    位置参数可以是表达式或Python值。字符串假定为列引用,并且将包装在F()表达式中,而其他值将包裹在Value()表达式中。

    **extra kwargs是可以插入到template属性中的key=value对。请注意,关键字function和template可用于分别替换function和template属性,而无需定义自己的类。output_field可用于定义预期的返回类型。

    更多详细链接

    Value() 表达式

    class Value(valueoutput_field=None)[源代码]

    Value() 对象表示表达式的最小可能组件:简单值。当您需要在表达式中表示整数,布尔值或字符串的值时,可以将该值包装在 Value() 中。

    你很少需要直接使用 Value()。当你写表达式 F('field') + 1 时,Django隐含地将 1 包装在 Value() 中,允许在更复杂的表达式中使用简单的值。当您要将字符串传递到表达式时,您将需要使用 Value()。大多数表达式将字符串参数解释为字段的名称,如 Lower('name')

    value 参数描述要包括在表达式中的值,例如 1True 或 None。 Django知道如何将这些Python值转换为相应的数据库类型。

    output_field 参数应该是一个模型字段实例,如 IntegerField() 或 BooleanField(),Django在从数据库检索后将加载该值。通常,在实例化模型字段时不需要任何参数,因为与数据验证(max_lengthmax_digits 等)相关的任何参数不会对表达式的输出值强制执行。

     

    条件表达式

    条件表达式允许你在过滤器,注解,聚合和更新操作使用if..else..逻辑。

    条件表达式为表中的每一行计算一系列的条件,并返回匹配到的结果表达式。

    When

    class When(condition=Nonethen=None**lookups)[source]

    When()对象用于封装条件和它的结果,为了在条件表达式中使用。使用When()对象和使用filter() 方法类似。条件可以使用字段查找 或者 Q 来指定。结果通过使用then关键字来提供

    Case

    class Case(*cases**extra)[source]

    Case()表达式就像是Python中的if ... elif ...else语句。每个提供的When()中的condition 按照顺序计算,直到得到一个真值。返回匹配When() 对象的result表达式。

    创建对象:

    
    from datetime import date, timedelta
    from django.db.models import CharField, Case, Value
    Client.objects.create(name='jane doe', account_type=Client.REGULAR, registered_on=date.today() - timedelta(days=36))
    #    <Client: Client object>
    Client.objects.create(name='james Smith', account_type=Client.GOLD, registered_on=date.today() - timedelta(days=5))
    #    <Client: Client object>
    Client.objects.create(name='Jack Black', account_type=Client.PLATINUM, registered_on=date.today() - timedelta(days=10*365))
    #    <Client: Client object>
    
    Client.objects.annotate(discount=Case(
                                        When(account_type=Client.GOLD, then=Value('%5')),
                                        When(account_type=Client.PLATINUM, then=Value('%10')),
                                        default=Value('0%'), output_field=CharField())).values_list('name', 'discount')
    <QuerySet [('jane doe', '0%'), ('james Smith', '%5'), ('Jack Black', '%10')]>
    

    Case() 接受任意数量的When()对象作为独立的参数。其它选项使用关键字参数提供。如果没有条件为TRUE,表达式会返回提供的default关键字参数。如果没有提供default参数,会使用Value(None)

    记住条件按照顺序来计算。这就像Python中的if ... elif ...else语句一样。

    Case() 也在filter() 子句中工作,如找到一个多月前注册的黄金客户和一年多前注册的白金客户

    ama = date.today() - timedelta(days=30)
    aya = date.today() - timedelta(days=365)
    
    Client.objects.filter(registered_on__lte=Case(When(account_type=Client.GOLD, then=ama), When(account_type=Client.PLATINUM, then=aya))).values_list('name', 'account_type')
    <QuerySet [('Jack Black', 'P')]>
    

    高级查询

    条件表达式可以用于注解、聚合、查找和更新。它们也可以和其它表达式混合和嵌套。这可以让你构造更强大的条件查询。

    条件更新

    假设我们要为客户更改 account_type 以符合其注册日期。我们可以使用条件表达式和 update()方法来做到这一点:

    ama = date.today() - timedelta(days=30)
    aya = date.today() - timedelta(days=365)
    
    
    Client.objects.update(account_type=Case(When(registered_on__lte=aya, then=Value(Client.PLATINUM)), When(registered_on__lte=ama, then=Value(Client.GOLD)), default=Value(Client.REGULAR)))
    3
    Client.objects.values_list('name', 'account_type')
    <QuerySet [('jane doe', 'G'), ('james Smith', 'R'), ('Jack Black', 'P')]>
    

    条件聚合

    弄清楚每个account_type 有多少个客户端(regular,gold,Platinum各自有多少个):

    在增加点数据

    Client.objects.create(
        name='Jean Grey',
        account_type=Client.REGULAR,
        registered_on=date.today())
    Client.objects.create(
        name='James Bond',
        account_type=Client.PLATINUM,
        registered_on=date.today())
    Client.objects.create(
        name='Jane Porter',
        account_type=Client.PLATINUM,
        registered_on=date.today())
    
    Client.objects.aggregate(
        regular=Sum(Case(When(account_type=Client.REGULAR, then=1), output_field=models.IntegerField())),
        gold=Sum(Case(When(account_type=Client.GOLD, then=1), output_field=models.IntegerField())),
        platinum=Sum(Case(When(account_type=Client.PLATINUM, then=1), output_field=models.IntegerField())),
    )
    {'platinum': 3, 'gold': 1, 'regular': 2}
    

     

    转载于:https://my.oschina.net/acutesun/blog/1518577

    展开全文
  • If 条件表达式

    千次阅读 2016-04-11 11:12:51
    条件表达式文件表达式 if [ -f file ] 如果文件存在 if [ -d … ] 如果目录存在 if [ -s file ] 如果文件存在且非空 if [ -r file ] 如果文件存在且可读 if [ -w file ] 如果文件存在且可写 if [ -x file ] ...

    条件表达式

    文件表达式
    

    if [ -f file ] 如果文件存在
    if [ -d … ] 如果目录存在
    if [ -s file ] 如果文件存在且非空
    if [ -r file ] 如果文件存在且可读
    if [ -w file ] 如果文件存在且可写
    if [ -x file ] 如果文件存在且可执行

    整数变量表达式
    

    if [ int1 -eq int2 ] 如果int1等于int2
    if [ int1 -ne int2 ] 如果不等于
    if [ int1 -ge int2 ] 如果>=
    if [ int1 -gt int2 ] 如果>
    if [ int1 -le int2 ] 如果<=
    if [ int1 -lt int2 ] 如果<

       字符串变量表达式
    

    If [ a=b ] 如果string1等于string2
    字符串允许使用赋值号做等号
    if [ string1!=string2 ] 如果string1不等于string2
    if [ -n string]string(00(true)if[zstring ] 如果string 为空
    if [ $sting ] 如果string 非空,返回0 (和-n类似)

    条件表达式引用变量要带$
    

    if [ a = b ] ;then
    echo equal
    else
    echo no equal
    fi
    [macg@machome ~]shtest.shinputa:5inputb:5noequala和$b,而是比较和a和b,自然a!=b)

    改正:
    if [ a=b ] ;then
    echo equal
    else
    echo no equal
    fi
    [macg@machome ~]$ sh test.sh
    input a:
    5
    input b:
    5
    equal

    -eq -ne -lt -nt只能用于整数,不适用于字符串,字符串等于用赋值号=
    [macg@machome ~]vitest.shechoninputyourchoice:readvarif[var -eq “yes” ]
    then
    echo varfi[macg@machome ] sh -x test.sh
    input your choice:
    y
    test.sh: line 3: test: y: integer expression_r_r_r expected
    期望整数形式,即-eq不支持字符串

    =放在别的地方是赋值,放在if [ ] 里就是字符串等于,shell里面没有==的,那是c语言的等于
    

    无空格的字符串,可以加” “,也可以不加
    [macg@machome ~]vitest.shechoinputa:readaechoinputisa”
    if [ a=123];thenechoequal123fi[macg@machome ] sh test.sh
    input a:
    123
    input is 123
    equal123

    = 作为等于时,其两边都必须加空格,否则失效
    

    等号也是操作符,必须和其他变量,关键字,用空格格开 (等号做赋值号时正好相反,两边不能有空格)
    [macg@machome ~]$ vi test.sh

    echo “input your choice:”
    read var
    if [ var=yes]thenechovar
    echo “input is correct”
    else
    echo varechoinputerrorfi[macg@machome ] vi test.sh

    echo “input your choice:”
    read var
    if [ var=yes]thenechovar
    echo “input is correct”
    else
    echo varechoinputerrorfi[macg@machome ] sh test.sh
    input your choice:
    y
    y
    input is correct
    [macg@machome ~]shtest.shinputyourchoice:nninputiscorrectthen,then,?ifvar="yes"连读成一个变量,而此变量为空,返回1,则走else [macg@machome ~]shtest.shinputyourchoice:yyinputerror[macg@machome ] sh test.sh
    input your choice:
    no
    no
    input error
    一切正常

    If  [  $ANS  ]     等价于  if [ -n $ANS ]
      如果字符串变量非空(then) , 空(else)
    

    echo “input your choice:”
    read ANS

    if [ ANS]thenechonoemptyelseechoempthfi[macg@machome ] sh test.sh
    input your choice: 回车

    empth 说明“回车”就是空串
    [macg@machome ~]$ sh test.sh
    input your choice:
    34
    no empty

    整数条件表达式,大于,小于,shell里没有> 和< ,会被当作尖括号,只有-ge,-gt,-le,lt
    

    [macg@machome ~]$ vi test.sh

    echo “input a:”
    read a
    if [ age100];thenecho3bitelseecho2bitfi[macg@machome ] sh test.sh
    input a:
    123
    3bit
    [macg@machome ~]$ sh test.sh
    input a:
    20
    2bit

    整数操作符号-ge,-gt,-le,-lt, 别忘了加-
    if test $a ge 100 ; then

    [macg@machome ~]shtest.shtest.sh:line4:test:ge:binaryoperatorexpectediftesta -ge 100 ; then

    [macg@machome ~]$ sh test.sh
    input a:
    123
    3bit

    ============================逻辑表达式=========================================

    逻辑非 !                   条件表达式的相反
    

    if [ ! 表达式 ]
    if [ ! -d num]num

    逻辑与 –a                    条件表达式的并列
    

    if [ 表达式1 –a 表达式2 ]

    逻辑或 -o                    条件表达式的或
    

    if [ 表达式1 –o 表达式2 ]

    逻辑表达式

        表达式与前面的=  != -d –f –x -ne -eq -lt等合用
    
        逻辑符号就正常的接其他表达式,没有任何括号( ),就是并列
    

    if [ -z “JHHOME"adHOME/$num ]

        注意逻辑与-a与逻辑或-o很容易和其他字符串或文件的运算符号搞混了
    
    展开全文
  • shell 条件表达式

    千次阅读 2011-10-31 11:25:18
    f 语句格式 if 条件 then  Command else  Command fi 别忘了这个结尾 If语句忘了结尾fi test.sh: line 14: syntax error: unexpected end of fi ... if 的三种条件表达式

    f 语句格式

    if  条件
    then
     Command
    else
     Command
    fi                              别忘了这个结尾
    If语句忘了结尾fi
    test.sh: line 14: syntax error: unexpected end of fi


        if 的三种条件表达式
    if
    command
    then

    if
     函数
    then
     命令执行成功,等于返回0 (比如grep ,找到匹配)
    执行失败,返回非0 (grep,没找到匹配)
    if [ expression_r_r_r  ]
    then 
     表达式结果为真,则返回0,if把0值引向then
    if test expression_r_r_r
    then
     表达式结果为假,则返回非0,if把非0值引向then

          
       [ ] &&  ——快捷if
    [ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
       && 可以理解为then
        如果左边的表达式为真则执行右边的语句
     

        shell的if与c语言if的功能上的区别
     shell if     c语言if
    0为真,走then  正好相反,非0走then
     不支持整数变量直接if
    必须:if [ i –ne 0 ]

    但支持字符串变量直接if
    if [ str ] 如果字符串非0
     支持变量直接if
    if (i )

     
    =================================以command作为if 条件===================================
      
        以多条command或者函数作为if 条件
    echo –n “input:”
    read user

    if
    多条指令,这些命令之间相当于“and”(与)
    grep $user /etc/passwd >/tmp/null      
    who -u | grep $user
    then             上边的指令执行成功,返回值$?为0,0为真,运行then
     echo "$user has logged"
    else     指令执行失败,$?为1,运行else                            
     echo "$user has not logged"
    fi   
    # sh test.sh
    input : macg
    macg     pts/0        May 15 15:55   .          2075 (192.168.1.100)
    macg has logged
       
    # sh test.sh
    input : ddd
    ddd has not logged  


        以函数作为if条件  (函数就相当于command,函数的优点是其return值可以自定义)
    if
    以函数作为if条件,
    getyn
    then   函数reture值0为真,走then
    echo " your answer is yes"
    else  函数return值非0为假,走else
    echo "your anser is no"
    fi  


       if command  等价于 command+if $?
    $ vi testsh.sh
    #!/bin/sh

    if
    cat 111-tmp.txt | grep ting1
    then
    echo found
    else
    echo "no found"
    fi
     $ vi testsh.sh
    #!/bin/sh

    cat 111-tmp.txt | grep ting1

    if [ $? -eq 0 ]
    then
    echo $?
    echo found
    else
    echo $?
    echo "no found"
    fi
    $ sh testsh.sh
    no found  
    $ sh testsh.sh
    1
    no found
    $ vi 111-tmp.txt
    that is 222file
    thisting1 is 111file

    $ sh testsh.sh
    thisting1 is 111file
    found
    $ vi 111-tmp.txt
    that is 222file
    thisting1 is 111file

    $ sh testsh.sh
    thisting1 is 111file
    0
    found

       
    ========================================以条件表达式作为 if条件=============================

        传统if 从句子——以条件表达式作为 if条件
    if [ 条件表达式 ]
    then
     command
     command
     command
    else
     command
     command
    fi
       
       条件表达式

    • 文件表达式

    if [ -f  file ]    如果文件存在
    if [ -d ...   ]    如果目录存在
    if [ -s file  ]    如果文件存在且非空 
    if [ -r file  ]    如果文件存在且可读
    if [ -w file  ]    如果文件存在且可写
    if [ -x file  ]    如果文件存在且可执行   

    • 整数变量表达式

    if [ int1 -eq int2 ]    如果int1等于int2   
    if [ int1 -ne int2 ]    如果不等于    
    if [ int1 -ge int2 ]       如果>=
    if [ int1 -gt int2 ]       如果>
    if [ int1 -le int2 ]       如果<=
    if [ int1 -lt int2 ]       如果<
       

    •    字符串变量表达式

    If  [ $a = $b ]                 如果string1等于string2
                                    字符串允许使用赋值号做等号
    if  [ $string1 !=  $string2 ]   如果string1不等于string2       
    if  [ -n $string  ]             如果string 非空(非0),返回0(true)  
    if  [ -z $string  ]             如果string 为空
    if  [ $sting ]                  如果string 非空,返回0 (和-n类似)    


        条件表达式引用变量要带$

    if [ a = b ] ;then    
    echo equal
    else
    echo no equal
    fi
    [macg@machome ~]$ sh test.sh
    input a:
    5
    input b:
    5
    no equal  (等于表达式没比较$a和$b,而是比较和a和b,自然a!=b)
    改正:
    if [ $a = $b ] ;then       
    echo equal
    else
    echo no equal
    fi
    [macg@machome ~]$ sh test.sh
    input a:
    5
    input b:
    5
    equal

                                                                                       
      -eq  -ne  -lt  -nt只能用于整数,不适用于字符串,字符串等于用赋值号=
    [macg@machome ~]$ vi test.sh
    echo -n "input your choice:"
    read var
    if  [ $var -eq "yes" ]
    then
    echo $var
    fi
    [macg@machome ~]$ sh -x test.sh
    input your choice:
    y
    test.sh: line 3: test: y: integer expression_r_r_r expected
                           期望整数形式,即-eq不支持字符串



        =放在别的地方是赋值,放在if [ ] 里就是字符串等于,shell里面没有==的,那是c语言的等于


       无空格的字符串,可以加" ",也可以不加
    [macg@machome ~]$ vi test.sh
    echo "input a:"
    read a
    echo "input is $a"
    if [ $a = 123 ] ; then
    echo equal123
    fi
    [macg@machome ~]$ sh test.sh
    input a:
    123
    input is 123
    equal123 

    展开全文
  • kotlin条件表达式

    2017-12-26 17:08:00
    函数表达式中使用 return 语句可以从函数表达式中返回。 fun foo() { ints.forEach(fun(value: Int){ if (value == 0) return print(value) }) } 当返回一个值时,解析器给了一个参考,比如(原文When ...

    if 表达式

    在 Kotlin 中,if 是带有返回值的表达式。因此Kotlin没有三元运算符(condition ? then : else),因为 if 语句可以做到同样的事。

    // 传统用法
    var max = a
    if (a < b) max = b
    
    // 带 else
    var max: Int
    if (a > b) {
    	max = a
    }
    else{
    	max = b
    }
    // 作为表达式
    val max = if (a > b) a else b

    if分支可以作为块,最后一个表达式是该块的值:

    val max = if (a > b){
    	print("Choose a")
    	a
    }
    else{
    	print("Choose b")
    	b
    }

    如果使用If作为表达式而不是声明(例如,返回其值或将其赋值给一个变量),表达式必须带有 else 分支。

    参看 if语法

    When 表达式

    when 取代了 C 风格语言的 switch 。最简单的用法像下面这样

    when (x) {
        1 -> print("x == 1")
        2 -> print("x == 2")
        else -> { // Note the block
            print("x is neither 1 nor 2")
        }
    }

    when会对所有的分支进行检查直到有一个条件满足。when 可以用做表达式或声明。如果用作表达式的话,那么满足条件的分支就是表达式的值jjs。如果用做声明,那么分支的值会被忽略。(与 if 表达式一样,每个分支是一个语句块,而且它的值就是最后一个表达式的值)

    在其它分支都不匹配的时候默认匹配 else 分支。如果把 when 做为表达式的话 else 分支是强制的,除非编译器可以证明分支条件已经覆盖所有可能性。

    如果有分支可以用同样的方式处理的话,分支条件可以连在一起:

    when (x) {
    	0,1 -> print("x == 0 or x == 1")
    	else -> print("otherwise")
    }

    可以用任意表达式作为分支的条件

    when (x) {
    	parseInt(s) -> print("s encode x")
    	else -> print("s does not encode x")
    }

    甚至可以用 in 或者 !in 检查值是否值在一个范围或一个集合中:

    when (x) {
        in 1..10 -> print("x is in the range")
        in validNumbers -> print("x is valid")
        !in 10..20 -> print("x is outside the range")
        else -> print("none of the above")
    }

    也可以用 is 或者 !is 来判断值是否是某个类型。注意,由于 smart casts ,可以不进行类型检查就可以使用相应的属性或方法。

    val hasPrefix = when (x) {
    	is String -> x.startsWith("prefix")
    	else -> false
    }

    when 也可以用来代替 if-else if 。如果没有任何参数提供,那么分支的条件就是简单的布尔表达式,当条件为真时执行相应的分支:

    when {
    	x.isOdd() -> print("x is odd")
    	x.isEven() -> print("x is even")
    	else -> print("x is funny")
    }

    参看when语法

    for 循环

    for 循环可以对所有提供迭代器的变量进行迭代。等同于 C# 等语言中的 foreach。语法形式:

    for (item in collection)
    	print(item)

    内容可以是一个语句块

    for (item: Int in ints){
    	// ...
    }

    像之前提到的, for 可以对任何提供的迭代器的变量进行迭代,比如:

    -- 有一个 iterator() 成员函数或扩展函数,其返回类型要

    -- 有一个 next() 成员函数或扩展函数, 并且

    -- 有一个返回 Boolean 的 hasNext() 成员函数或扩展函数。

    这三个函数都需要标记为运算符.

    对数组的for循环不会创建迭代器对象,而是被编译成一个基于索引的循环.

    如果你想通过 list 或者 array 的索引进行迭代,你可以这样做:

    for (i in array.indices)
    	print(array[i])

    这里需要说明的是 "iteration through a range " 会被自动编译成最优的实现,并不会有附加对象生成。

    或者,您也可以使用withIndex库函数

    for ((index, value) in array.withIndex()) {
        println("the element at $index is $value")
    }

    参看for语法

    while 循环

    while 和 do...while 和其它语言没什么区别

    while (x > 0) {
    	x--
    }
    
    do {
    	val y = retrieveData()
    } while (y != null) // y 在这是可见的

    Kotlin 有三种结构跳转表达式:

    -- return
    -- break 结束最近的闭合循环
    -- continue 跳到最近的闭合循环的下一次循环

    上述表达式都可以作为更大的表达式的一部分:

    val s = person.name ?: return

    这些表达式的类型是 Nothing type

    break 和 continue 标签

    在 Kotlin 中表达式可以添加标签。标签通过 @ 结尾来表示,比如:abc@fooBar@ 都是有效的(参看语法)。使用标签语法只需像这样:

    loop@ for (i in 1..100){
    	// ...
    }

    我们可以用标签实现 break 或者 continue 的快速跳转:

    loop@ for (i in 1..100) {
    	for (j in i..100) {
    		if (...)
    			break@loop
    	}
    }

    break 是跳转标签后面的表达式,continue 是跳转到循环的下一次迭代。

    返回到标签

    在字面函数,局部函数,以及对象表达式中,函数在Kotlin中是可以嵌套的。合法的return 允许我们返回到外层函数。最重要的使用场景就是从lambda表达式中返回,还记得我们之前的写法吗:

    fun foo() {
    	ints.forEach {
    		if (it  == 0) return
    		print(it)
    	}
    }

    return 表达式返回到最近的闭合函数,比如 foo (注意这样非局部返回仅仅可以在内联函数中使用)。如果我们需要从一个字面函数返回可以使用标签修饰 return :

    fun foo() {
    	ints.forEach lit@ {
    		if (it ==0) return@lit
    		print(it)
    	}
    }

    现在它仅仅从字面函数中返回。经常用一种更方便的含蓄的标签:比如用和传入的 lambda 表达式名字相同的标签。

    fun foo() {
    	ints.forEach {
    		if (it == 0) return@forEach
    		print(it)
    	}
    }

    另外,我们可以用函数表达式替代匿名函数。在函数表达式中使用 return 语句可以从函数表达式中返回。

    fun foo() {
    	ints.forEach(fun(value:  Int){
    		if (value == 0) return
    		print(value)
    	})
    }

    当返回一个值时,解析器给了一个参考,比如(原文When returning a value, the parser gives preference to the qualified return, i.e.):

    return@a 1

    表示 “在标签 @a 返回 1 ” 而不是返回一个标签表达式 (@a 1)

    命名函数自动定义标签:

    foo outer() {
    	foo inner() {
    		return@outer
    	}
    }
    展开全文
  • 在不讨论 lambda 表达式的情况下, 我很难深入地讲授 Python 类. 我经常遇到有关它们的问题. 学生们往往会 StackOverflow 或者他们同事的代码(实际上, 这个也可能来自StackOverflow)碰到他们. 我对 lambda 有很...
  • C语言switch的条件表达式要求

    万次阅读 2017-09-16 10:12:17
    switch语句是多分支选择语句,一般...switch只针对基本数据类型使用,即switch后面括号内的表达式,其值得类型应为整数类型(包括字符型),也就是(int,char,枚举,bool),对于其他类型,应该考虑其他条件控制语句例如i
  • 条件表达式允许过滤器、注解、聚合和更新操作中使用 if ... elif ... else的逻辑。条件表达式为表中的每一行计算一系列的条件,并且返回匹配到的结果表达式。条件表达式也可以像其它 表达式一样混合和嵌套。条件...
  • shell常用条件表达式

    千次阅读 2017-10-30 12:09:52
    文件表达式if [ -f file ] 如果文件存在 if [ -d ... ] 如果目录存在 if [ -s file ] 如果文件存在且非空 if [ -r file ] 如果文件存在且可读 if [ -w file ] 如果文件存在且可写 if [ -x file ] 如果文件存在且可...
  • 本篇介绍 SQL 标准的 CASE 条件表达式,以及六种主流数据库的实现及差异:Oracle、MySQL、Microsoft SQL Server、PostgreSQL、Db2、SQLite。
  • 传统if 从句子——以条件表达式作为 if条件 if [ 条件表达式 ] then   command  command  command else  command  command fi    条件表达式 文件表达式 if [ -f file ] 如果文件存在 ...
  • Justinmind的计算表达式以及条件condition的使用对于初学者而言比较麻烦。 结合网上了一个教程本文主要针对计算器示例进行计算表达式以及条件使用
  • 如何 PHP 中使用正则表达式

    千次阅读 2006-03-14 15:01:00
    如何 PHP 中使用正则表达式检验用户输入、解析用户输入和文件内容,以及重新格式化字符串 级别: 中级Nathan A. Good, 顾问, Alliance of Computer Professionals2006 年 3 月 13 日正则表达式提供了一种处理文本...
  • mysqlREGEXP正则表达式使用

    千次阅读 2017-07-17 14:45:32
    MySQL采用了扩展的版本,以支持SQL语句与REGEXP操作符一起使用的模式匹配操作。 正则表达式描述了一组字符串。最简单的正则表达式是不含任何特殊字符的正则表达式。例如,正则表达式hello匹配hello。 非平凡的...
  • 摘要:就让我们看看以下几种常见的条件表达场景,如何写的漂亮!
  • java中使用正则表达式

    千次阅读 2009-11-10 18:13:00
    转自:http://student.csdn.net/space.php?uid=52781&do=blog&id=15267&cid=50252java中使用正则表达式计算机专业毕业或者使用过Unix、Perl等产品的读者一定对正则表达式有一定的印象,即使没有接触过正则表达式也...
  • 1.1.6 条件表达式和 判断式子(返回真或假的布尔值) 当前我们能够定义的程序的类型的表达力是很有限的,因为我们还没有进行测试和根据 测试的结果执行不同的操作的方式。例如我们还能定义一个程序,通过测试一个...
  • python3 if语句和条件表达式

    千次阅读 2018-08-10 11:47:50
     让程序根据条件选择性的执行某条语句或某些语句  语法: if 真值表达式1:  语句块1... elif 真值表达式2:  语句块2... elif 真值表达式3:  语句块3... ... else:  语句块4...   说明: 1. ...
  • Android Stutio中使用java8的Lambda表达式

    千次阅读 2016-05-29 14:36:47
    目录:为什么要使用Lambda表达式 让Android Stutio支持Lambda 函数式接口Functional interfaces Lambda表达式的目标类型以及匹配 Lambda表达式语法 1 基础语法和语法简化 2 Lambda表达式的词法作用域 3 变量捕获  ...
  • shell条件判断表达式

    千次阅读 2018-09-12 14:01:30
    IF条件判断 1、基本语法: if [ command ]; then 符合该条件执行的语句 fi 2、扩展语法: if [ command ];then 符合该条件执行的语句 elif [ command ];then 符合该条件执行的语句 else 符合该条件执行的语句 fi 3、...
  • 正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。 给定一个正则表达式和另一个字符串,我们可以达到如下的目的...
  • MySQL使用正则表达式

    千次阅读 2017-12-26 17:18:46
    以前我要查找数据都是使用like后来发现mysql也有正则表达式了并且感觉性能要好于like,下面我来给大家分享一下mysql REGEXP正则表达式使用详解,希望此方法对大家有帮助。 一、正则与LIKE的区别  Mysql...
  • MySQLREGEXP正则表达式使用大全

    千次阅读 2018-06-14 16:07:43
    以前我要查找数据都是使用like后来发现mysql也有正则表达式了并且感觉性能要好于like,下面我来给大家分享一下mysql REGEXP正则表达式使用详解,希望此方法对大家有帮助。MySQL采用Henry Spencer的正则表达式实施...
  • 表达式

    2018-08-10 15:11:02
    表达式由一个或多个运算对象组成,对表达式求值将得到一个结果。字面值和变量是最简单的表达式,其结果就是字面值和变量的值。把一个运算符和一个或多个运算对象组合起来可以生成较复杂的表达式。 基础 1、基本...
  • 正则表达式-嵌入条件

    千次阅读 2015-12-12 19:29:12
    不是所有环境下的正则表达式都支持条件处理。 正则表达式里的条件要用?定义。 ?这个元字符表示的意思很多,一定要区分开。有这么几种意思: a.作为量词,跟一个字符或子表达式后面表示可出现0或1次。 b.表非...
  • vb中使用正则表达式

    万次阅读 2012-09-21 08:15:10
    之前做学生管理系统和和现在做的机房收费系统都有一些数据需要用户输入,比如注册学生信息...做学生管理系统时处理这类事件用的是先判断是否为数字然后用if语句判断输入的数字是否介于0-99之间。其实最好的解决方法
  • 深入入门正则表达式(java) - 引言深入入门正则表达式(java) - 1 - 入门基础 深入入门正则表达式(java) - 2 - 基本实例深入入门正则表达式(java) - 3 - 正则java使用深入入门正则表达式(java) - ...
  • Groovy编写正则表达式

    千次阅读 2012-09-24 17:40:27
    本文介绍了如何Groovy编写正则表达式。Groovy对正则表达式中需要处理的Pattern和Matcher对象做了简单封装,添加了一些额外的实用方法,并给出一个简化的新的语法和3个新的操作符。 AD: 51CTO云计算架构师...
  • EL表达式和JSTL标签库使用

    千次阅读 2017-08-06 21:18:44
     表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了 JSP 简化表达式的方法。它是一种简单的语言,基于可用的命名空间(PageContext 属性)、嵌套属性和对集合、操作符(算术型、关系型和逻辑型...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 236,947
精华内容 94,778
关键字:

在条件表达式中不允许使用