比较


In [5]:
print(1==1)
print(1==1.0)
print(1=='1')


True
True
False

In [13]:
print([1,2]==[2,1])

print({1,2}=={2,1})

print((1,2)==(2,1))


False
True
False

循环

break和continue这两个关键字用来中断循环,break用来中断本层循环,continue只用来中断本次循环。


In [24]:
for i in range(3):
    print(i)
    
print("")

for i in range(0,3):
    print(i)


0
1
2

0
1
2

In [25]:
for i in [1,2,3]:
    print(i)


1
2
3

In [26]:
for i in {1,2,3}:
    print(i)


1
2
3

In [36]:
#读取字典的键值
for i in {1:2,3:4}:          
    print(i)
print(" ")

for i in {1:2,3:4}.keys():  
    print({1:2,3:4}[i])


1
3
 
2
4

In [37]:
i = 1
while(i == 1):
    i = 0
    print("1")


1

函数


In [40]:
#写法
def getName():
    print("i am")
    return "H"
print(getName())


i am
H

In [66]:
#空函数
def getName():
    None
print(getName())


None

In [67]:
#异常简介,编译器会报类型错误的异常
abs("a")


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-67-3e31dfc26a05> in <module>()
      1 #异常简介,编译器会报类型错误的异常
----> 2 abs("a")

TypeError: bad operand type for abs(): 'str'

In [52]:
try:
    abs("a")
except TypeError:
    print("typeError")


typeError

In [65]:
#使用raise进行参数检测
s = "aa" 
def getName(name):
    if(type(name) == type("")):
        return name
    else:
        raise TypeError("%s is not a string"%name)
getName([1,2])


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-65-8098c4b40f0a> in <module>()
      6     else:
      7         raise TypeError("%s is not a string"%name)
----> 8 getName([1,2])

<ipython-input-65-8098c4b40f0a> in getName(name)
      5         return name
      6     else:
----> 7         raise TypeError("%s is not a string"%name)
      8 getName([1,2])

TypeError: [1, 2] is not a string

In [99]:
#可以在函数里面定义函数
def cook():
    print("before")
    def cookready():
        print("ready")
    cookready()

cook()


before
ready

In [71]:
#参数传递,python中所有传值都是引用传值
def changeName(s):
    s = 10

a = "ss"
changeName(a)
print(a)


ss

参数类型


In [108]:
#必要参数,必须在调用的时候带入的参数,也是最常见的一种参数
def getName(x):
    print(x)
getName(10)
print("")

def getInfo(name,age):
    print(name)
    print(age)

getInfo("j",10)
print("")

getInfo(age=20,name="j")


10

j
10

j
20

In [80]:
#默认参数
def people(name,age,lifespan=100,has_house=True):
    print(name)
    print(age)
    print(lifespan)
    print(has_house)
people("ja",10)
print("")

people("ja",10,20)
print(" ")

people("ja",10,has_house=False)


ja
10
100
True

ja
10
20
True
 
ja
10
100
False

In [98]:
#当默认参数是一个列表的时候,注意每次调用函数,会记住上次的状态
#因为L被初始化成了一个变量
def getList(L=[]):
    L.append("a")
    print(L)
getList()
getList()


['a']
['a', 'a']

In [97]:
def getList(L=[1,3]):
    L.append("a")
    print(L)
getList()
getList()


[1, 3, 'a']
[1, 3, 'a', 'a']

In [116]:
#为了避免这种情况我们应该将默认参数指向不变参数
#或者在函数内部增加一层判断
def getList(L=[]):
    if L==[]:
        L=["a"]
    print(L)
getList()
getList()
getList([12,34])


['a']
['a']
[12, 34]

In [160]:
#不定长参数,用*表示所有新加入的不确定的参数,可空
def getParam(name,*prop):
    print(name)
    print(prop)    #将参数放置到元组中
    for i in prop:
        print(i)
getParam("name","j",12,[12,2],(12,3,3),{1,2},{1:2,2:2})


name
('j', 12, [12, 2], (12, 3, 3), set([1, 2]), {1: 2, 2: 2})
j
12
[12, 2]
(12, 3, 3)
set([1, 2])
{1: 2, 2: 2}

In [161]:
getParam('j')


j
()

In [163]:
a = [1,2,3]
getParam("j",a)


j
([1, 2, 3],)
[1, 2, 3]

In [165]:
getParam("j",key=10)#不能用字典的形式传值


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-165-c86a231c3524> in <module>()
----> 1 getParam("j",key=10)#不能用键值法传值

TypeError: getParam() got an unexpected keyword argument 'key'

In [171]:
#另一种可变参数,区别是上面将参数放置到一个tuple中,且不能使用字典的形式传值,可以使用list传
#而**的可变参数刚好相反,只能使用字典传参数

def getParamNew(name,**prop):
    print(name)
    print(prop)
    for i in prop:
        print(i,prop[i])

In [172]:
getParamNew("j")


j
{}

In [173]:
a = {1:1,2:2}
getParamNew("j",age=10)


j
{'age': 10}
('age', 10)

In [174]:
#将上面组合起来
def getInfo(name,age=10,*kw,**prop):
    print(name,age,kw,prop)

getInfo("j",20,30,100,prop=10)


('j', 20, (30, 100), {'prop': 10})

In [180]:
getInfo("j",(1,2,3),prop=20,a=30)


('j', (1, 2, 3), (), {'a': 30, 'prop': 20})

In [185]:
getInfo("j",age=20,2,3,prop=30,a=30) #age显式赋值后,后面的赋值出错,具体原因不详


  File "<ipython-input-185-51234be04d72>", line 1
    getInfo("j",age=20,2,3,prop=30,a=30) #age显式赋值后,后面的赋值出错,具体原因不详
SyntaxError: non-keyword arg after keyword arg

In [196]:
kw = (1,2,3)
prop = {"key1":1,"key2":2}
getInfo("j",2,kw,prop)   #如果没有显式的字典赋值,那么字典就会默认为*式的赋值


('j', 2, ((1, 2, 3), {'key2': 2, 'key1': 1}), {})

In [197]:
kw = (1,2,3)
prop = {"key1":1,"key2":2}
getInfo("j",2,kw,key3=3)   #如果没有显式的字典赋值,那么字典就会默认为*式的赋值


('j', 2, ((1, 2, 3),), {'key3': 3})

In [201]:
#*args和**kw是惯用写法,一般使用这种写法,不这么写也可以

匿名函数

匿名函数的好处是调用函数不占用栈空间,可以增加程序执行效率


In [199]:
#匿名函数又称为lambda表达式
sum = lambda x,y : x+y
print(sum(1,2))


3

In [3]:
#def 在python中可以算作一条语句,当运行到它的时候,就建立 一个新的函数对象
#并将其赋值给一个变量名,所以def 可以内插到程序内部

if True:
    def func():
        print("i am func")
    func()


i am func

In [ ]: