1、前言
在每種語言中,總是會存在函式,那麼為什麼每種語言都有函式這個東西呢?
函式,簡單的來說,是一種對程式在邏輯上進行結構化的一種程式設計方法,主要就是將需要解決的問題來進行抽象,來進行分解,從而達到**復用的目的。
2、函式的基本概念
建立函式如下:
函式物件或者函式引用如下:>>> def createfunction(x,y):
... return x+y
>>> createfunction
函式呼叫:
在函式的返回值方面有幾個分類如下:>>> createfunction(3,2)
5
a、 當返回0個值也就是沒有返回值的時候,返回的值為none
b、當返回值為1個的時候,返回值為object
c、當返回值大於1個的時候,返回值為乙個tuple --當返回值為tuple的時候,可以進行解包,也就是unpack,如下:
>>> def returnatuple(x):
... return x,3,4
...
>>> x,y,z = returnatuple(1) #unpack操作,將返回值分別進行賦值
>>> x,y,z
(1, 3, 4)
函式的引數:
包括函式的形參:在函式中定義的引數,例如f(x)中的x表示為形參
在呼叫函式的實參:也就是在呼叫函式的時候傳入的引數,例如multi(4,5)也就是實際引數
3、呼叫引數
在呼叫引數的時候,有幾種特殊的引數需要注意,乙個是元組,也就是非關鍵字引數;乙個是字典,也就是關鍵字引數。
在進行呼叫的語法如下:
a、 順序問題:關鍵字引數必須位於非關鍵字後面否則會報錯syntax error,如下所示:>>> def func(*tuple_nonkw_args,**dict_kw_args):
... pass
...
b、 關鍵字引數,必須是變數等於的形式,如下:>>> func(3,4,name='kel',4)
file "", line 1
syntaxerror: non-keyword arg after keyword arg
c、 在字典做引數的時候:>>> func(3,4,'name'='kel')
file "", line 1
syntaxerror: keyword can't be an expression
在使用字典的時候,必須使用雙星號,也就是**dict;可以使用關鍵字方法,例如name=『kel』
函式呼叫引數主要規則如下:>>> func(1,**dict)
"(1,) "
>>> func(1,name='kel')
"(1,) "
>>>func(1,dict) #在使用字典的時候,如果字典不用雙星號進行標記,那麼就會出現如下錯誤,將字典的值也傳遞給了tuple"(1, ) {} "
4、 在未宣告不允許呼叫函式>>> def func(positional_args,keyword_args,*tuple_nonkw_args,**dict_kw_args):
... pass
...
在未進行宣告的時候,不允許呼叫函式。
在宣告的時候,順序是可以改變的,只要在呼叫的時候,已經宣告過了即可,如下:
從上面例子可以看到,在定義函式foo的時候,並沒有定義bar,但是函式定義成功>>> def foo():
... print 'foo is called'
... bar()
...
>>> def bar():
... print 'bar is called'
...
>>> foo()
foo is called
bar is called
在呼叫函式foo的時候,bar函式已經宣告了,從而可以正確執行
在python中,前向引用函式或者後向引用函式都是可以的,不會出現報錯,但是在呼叫的時候,函式一定已經存在宣告。
以下內容是從python核心程式設計中引出,如下:
#!/usr/bin/env python
from operator import add,sub
from random import choice,randint
maxtries = 2 #用來定義最大嘗試次數
op = #主要用字典來定義使用的計算
def doprobe():
'use to print the calculate math and the check result'
nums = [randint(1,10) for i in range(2)]
nums.sort(reverse=true)
opera = choice('+-')
oops = 0
pr = '%d %s %d ' %(nums[0],opera,nums[1]) #列印出來的計算式
answer = op[opera](*nums) #在此,直接使用字典來呼叫方法,並且直接將引數作為乙個元組進行傳入然後計算。
ans = '%d %s %d = %d' % (nums[0],opera,nums[1],answer) #計算結果
while true:
try:
print pr
userinput = int(raw_input('answer is : '))
if userinput == answer:
print 'correct'
break
elif oops == maxtries:
print ans
else:
print 'incorrect ,try again'
oops += 1
except (keyboardinterrupt,eoferror,valueerror):
print 'invalid input ...try again'
def main():
'this is to sure continue the math'
while true:
doprobe()
try:
userchoice = raw_input('continue ? [y]/ [n]').lower()
if userchoice and userchoice[0] == 'n':
break
except:
print 'quit for math'
break
if __name__ == '__main__':
main()
執行結果如下:
[root@python 419]# python easymath.py
10 + 1
answer is : 11
correct
continue ? [y]/ [n]
10 + 5
answer is : 12
incorrect ,try again
10 + 5
answer is : 13
incorrect ,try again
10 + 5
answer is : 1
10 + 5 = 15
10 + 5
answer is : 1
10 + 5 = 15
10 + 5
answer is : 15
correct
continue ? [y]/ [n]n
在以上例子中:
主要使用兩個方法來分割整個計算,在main中主要是用來做是否迴圈的詢問,在doprobe函式中,主要是用來進行列印計算公式和計算結果。
在進行呼叫函式的時候,第乙個是使用字典來實現case ,when的選擇,第二個是在傳遞計算引數的時候,直接使用乙個元組來呼叫引數。
在進行模組編寫的時候,常量寫在最上面,從而可以直接使用。
關於SQLALCHEMY之(一)
sqlalchemy是乙個不可靠的方案。對於初級開發者而言,並不如sql語句來得簡明。或者說,我不知道是不是所有的orm資料庫物件對映方案都存在這麼一種情況。純以開發邏輯而言。下述兩段 的結論是一致的 code1 正確實現 partner name request.args.get partner ...
總結之一6 6
獵頭不是槍手 獵頭公司不是包辦公司,也不是幫候選人寫簡歷的槍手,候選人往往希望獵頭公司給他們的簡歷 潤色 但是包裝只是對簡歷本身而言讓你的優勢更突出,絕不會幫助你 包裝 你本身不具備的能力。另外簡歷一定不能做假,因為現在越來地越多的公司會做背景調查,職位越高,做調查的時間越長。當然,獵頭會幫助你整合...
LeetCode總結之一
最近在陸陸續續的練習leetcode,將自己以前的只是總綜合鞏固一下,也為了以後面試準備。盡量從自己的所思所想出發,鄙人菜鳥,還請勿噴。整個練習過程中採用c 1 我練習主要遵從一下幾個習慣 from easy to hard similar problems tags.2 由於是第一次練習oj,很多...