網(wǎng)上有很多關(guān)于pos機(jī)編程教程,python編程系列教程的知識,也有很多人為大家解答關(guān)于pos機(jī)編程教程的問題,今天pos機(jī)之家(www.shineka.com)為大家整理了關(guān)于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
2、收銀機(jī)pos機(jī),庫存,錄入,都怎么弄,最好具體點(diǎn),使用說明?
pos機(jī)編程教程
我們之前所有寫過的代碼,都比較固定,且目的單一,復(fù)用性差等等的缺點(diǎn)。那我們想要重復(fù)利用一段代碼,僅通過改變它的變量,就可以產(chǎn)生不同的結(jié)果,這樣可不可以呢?這就是函數(shù)所能做到的功能。
def fib(n): # write Fibonacci series up to n """Print a Fibonacci series up to n.""" a, b = 0, 1 while a < n: print(a, end=' ') a, b = b, a+b print()# Now call the function we just defined:fib(2000) # 此處可以任意更改你想要的范圍
這段官方示例代碼,就是把我們之前寫的斐波那契數(shù)列加了一層函數(shù),這下我們可以任意計(jì)算斐波那契數(shù)列了。
The keyword def introduces a function definition
所以,函數(shù)的關(guān)鍵字def就是definition的縮寫,后面跟著函數(shù)名字,并把該函數(shù)的參數(shù)用括號括起來,以冒號結(jié)果。函數(shù)主體要和這一句保持四個空格的縮進(jìn),也就是“must be indented”。
冒號以下的部分,稱之為body,body里的第一句話卻是用三個引號給包起來了。我們知道前面說過的字符串類型(str)的字符,是用單引號或雙引號引起來的,但在這里用三個引號引起來的是另外一種類型,是文檔類型的字符,(documentation string, docstring),用來說明本函數(shù)的作用 。這一部分是可選的,但是官方建議養(yǎng)成這個習(xí)慣,關(guān)于它的作用,我們后面很快提到。
so make a habit of it.
剩下的就是執(zhí)行的部分了(execution) ,這里就是我們最初開始寫的fib循環(huán)
a, b = 0, 1while a < n: # 這里的n是函數(shù)傳參過來的 print(a, end=' ') # print()默認(rèn)是以\結(jié)束,\被被翻譯成newline,新起一行的意思。可以試試print('abc\def')會發(fā)生什么。 a, b = b, a+bprint() # 這里為什么要有一個空的print?請自行實(shí)驗(yàn)去掉后會有什么情況發(fā)生
fib(2000)就是在調(diào)用這個函數(shù),同時將2000這個參數(shù)傳入,while循環(huán)里的n會將這個參數(shù)代入進(jìn)行計(jì)算,這就是這段代碼的含義了。如果你仔細(xì)閱讀過官方關(guān)于這段代碼的解釋,你會發(fā)現(xiàn)它提到一個local variables的相關(guān)概念,即變量又有本地和全局之分。這里的本地指的是函數(shù)內(nèi)的變量,外面并不可以直接使用,比如看下面的例子:
a=1def b(n): c = n print(c)b(a)print(c)
c就是函數(shù)b的本地變量,它只能在函數(shù)內(nèi)生效,而在函數(shù)外卻讀不到這個變量,而a在函數(shù)內(nèi)外都可以讀到。關(guān)于函數(shù)的影響范圍,我們后面還會提到。當(dāng)前只是讓大家熟悉編程,如果每一個細(xì)節(jié)都精講,對大家來說是負(fù)擔(dān)。而在熟悉編程之后,這些細(xì)節(jié)卻又可以提升你的編程能力。所以不要急,我們目前僅需要知道“億點(diǎn)點(diǎn)”知識,可以讓代碼跑起來,大致理解這段代碼的含義即可。
函數(shù)執(zhí)行是帶括號執(zhí)行,而不帶括號只運(yùn)行函數(shù)的名字,就會返回一串神秘代碼
這就相當(dāng)于一個碗是用來盛飯的,而你只在那里大叫“碗!碗!碗!”,它根本什么作用都沒有發(fā)揮,而只有你端起碗盛飯,這里它才起了作用。所以當(dāng)你不帶括號運(yùn)行函數(shù)時,什么作用都不會發(fā)揮,它只會返回這個函數(shù)所在的“地址”,這個“地址”是什么東西,同樣請你暫時忽略,后面會講到。
編程需要了解操作系統(tǒng)原理,所以當(dāng)碰到相關(guān)概念時,我們不得不暫時跳過。熟悉編程后,有些東西稍微一提,你當(dāng)即就會舉一反三,很快理解。不過想全面了解操作系統(tǒng)原理,還是需要查閱相關(guān)書籍的。但是一定一定要動手,本教程及官方文檔的示例代碼,請一定要手動跟著敲打出來,這已經(jīng)是非常簡單的代碼了。
函數(shù)都是會返回一個值的,即使你沒有寫出return這個語句。所以官方在這里給其它編程語言的程序員解釋了一下。
Coming from other languages, you might object that fib is not a function but a procedure since it doesn’t return a value.
python會在你沒有感知的情況下,做了很多事情,所以讓你編程時更輕松更簡單。比如你不寫return,它默認(rèn)“幫”你寫了return并反回"None"這個值,而其它編程語言如果不寫return語句,可能會直接提示語法錯誤。所以官方的下一段代碼便讓fib用return返回值,此時你再使用pint(fib2(100))時,卻不返回None了。
另外值得一提的是result.append(a)這一段代碼,result是個列表,前面我們只是簡單了解了它,和字符串str有些類似。這里的append是在向列表追加內(nèi)容。我們知道無論是str, num還是list,function等等我們所有見過的各種類型,在python里都叫object,這些object都有某些方式去操作它,這些方式叫作method,而append就是list的操作方式之一,以后我們會碰到很多,先這樣理解。
函數(shù)的使用是非常靈活的,因此在定義函數(shù)時,有很多用法。
函數(shù)定義時給予默認(rèn)值,這個官方示例代碼結(jié)合了循環(huán)、判斷和函數(shù)定義。
def ask_ok(prompt, retries=4, reminder='Please try again!'): # prompt, retries和reminder都是參數(shù) while True: ok = input(prompt) if ok in ('y', 'ye', 'yes'): return True if ok in ('n', 'no', 'nop', 'nope'): return False retries = retries - 1 if retries < 0: raise ValueError('invalid user response') print(reminder)
嘗試下面的每一個函數(shù)調(diào)用
ask_ok('Do you really want to quit?')ask_ok('OK to overwrite the file?', 2)ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
運(yùn)行過上面的代碼,如果你在其中故意亂輸入一些字符,它會提示你'Please try again!',直到某次之后它直接退出,然后報錯'invalid user response'。你會發(fā)現(xiàn)定義函數(shù)時括號內(nèi)的prompt, retries等變量會和你調(diào)用函數(shù)時的括號里傳進(jìn)去的參數(shù)順序保持一致。你的傳參會改變函數(shù)運(yùn)行時的動作,這樣一來,函數(shù)的使用范圍更廣了。即使你有不同的使用目的,只要函數(shù)設(shè)計(jì)得恰當(dāng),你都可以拿來使用,復(fù)用率非常高,還省事兒。
上面的示例代碼,也不難理解,都是你見過的東西,唯一兩個不同的是in和raise這兩個關(guān)鍵字(keyword)。
in是判斷一個序列(sequence)里,有沒有一個特定的值,比如ABC里有沒有D?比如123里有沒有2等等。
另外一個是raise, 會主動拋出指定的錯誤類型然后停止腳本的執(zhí)行。不過我們目前對python中的錯誤類型并不熟悉,你只需要知道raise的作用就可以,以后我們會單獨(dú)講一下它。
這樣你就可以自行理解以上的代碼了,如果還是不理解,多運(yùn)行一下那三句調(diào)用函數(shù)的代碼,然后結(jié)合之前的內(nèi)容,理解這段代碼。
還要注意的是變量和函數(shù)之間的影響,就比如官方在這兩段代碼中展示的變量和函數(shù)的影響范圍:
i = 5def f(arg=i): # 這里的函數(shù)傳參使用了已經(jīng)定義過了的變量 print(arg)i = 6 # 改變函數(shù)定義時使用的變量f() # 輸出結(jié)果只使用函數(shù)定義那一刻的變量值,后續(xù)被引用的變量值改變,也不會影響函數(shù)已經(jīng)使用了的變量。
def f(a, L=[]): L.append(a) return Lprint(f(1)) # 函數(shù)里定義了L這個列表,雖然在外面看不到,但重復(fù)調(diào)用這個函數(shù),該列表卻發(fā)生了改變。print(f(2))print(f(3))
為什么會這樣,為什么第一個函數(shù)的參數(shù)i不會改變,而第二個函數(shù)的參數(shù)L卻在不停的變?
Important warning: The default value is evaluated only once. This makes a difference when the default is a mutable object such as a list, dictionary, or instances of most classes.
官方在這里著重解釋了,當(dāng)函數(shù)使用可變的對象(object)作用默認(rèn)值時,和不可用對象作為默認(rèn)值有顯著區(qū)別,如何去理解?
i = 5def f(arg=i): # 這里的i會使用i的值,是5,而5是個具體的值,不可改變。def f(a, L=[]): # 這里的L定義了一個列表,但是列表是可變的,所以在運(yùn)行該函數(shù)時,輸出內(nèi)容總是互相影響。
如何避免這種互相影響的局面呢?官方也已給出了答案。
def f(a, L=None): if L is None: L = [] # 每次運(yùn)行函數(shù)時,L都會被重置為一個空的列表,這樣就不會影響下次調(diào)用的結(jié)果了。 L.append(a) return L
理解了上面的默認(rèn)值,那么也可以理解關(guān)鍵字(Keyword Arguments)的函數(shù)定義與調(diào)用。關(guān)鍵字即一對key和value組成的,這種類型的對象可以直接指定參數(shù)的關(guān)系,這種關(guān)系叫作字典(dict)。比如”張三=男“和 ”李蕊=女“,就可以直接得到兩個姓名以及他們對應(yīng)的性別,而不用再使用其它變量單獨(dú)定義性別。它與上在的默認(rèn)值的區(qū)別就是”=“號,有=的就是keyword argument, 沒有等號的就是普通的arguments。
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'): print("-- This parrot wouldn't", action, end=' ') print("if you put", voltage, "volts through it.") print("-- Lovely plumage, the", type) print("-- It's", state, "!")
帶有關(guān)鍵字的函數(shù)調(diào)用方法:
parrot(1000) # 1 positional argumentparrot(voltage=1000) # 1 keyword argumentparrot(voltage=1000000, action='VOOOOOM') # 2 keyword argumentsparrot(action='VOOOOOM', voltage=1000000) # 2 keyword argumentsparrot('a million', 'bereft of life', 'jump') # 3 positional argumentsparrot('a thousand', state='pushing up the daisies') # 1 positional, 1 keywordparrot(voltage=1000000, action='VOOOOOM', state='BOOOOM') # keyword arguments的順序可以打亂順序可以打亂
但以下使用方法是錯誤的:
parrot() # required argument missingparrot(voltage=5.0, 'dead') # non-keyword argument after a keyword argumentparrot(110, voltage=220) # duplicate value for the same argumentparrot(actor='John Cleese') # unknown keyword argument
最重要的一點(diǎn)是,位置參數(shù)(如valtage),一定要在關(guān)鍵字參數(shù)(如state='a stiff')之前,而關(guān)鍵字參數(shù)的順序就可以隨意打亂了,如上面的例子。
下面的官方示例代碼很詳細(xì)地解釋了,(位置)參數(shù),關(guān)鍵字參數(shù),只包含位置參數(shù)和只包含關(guān)鍵字參數(shù)的用法:
def standard_arg(arg): # 普通參數(shù),即位置參數(shù)print(arg)def pos_only_arg(arg, /): # 只允許位置參數(shù)print(arg)def kwd_only_arg(*, arg): # 只允許關(guān)鍵字參數(shù)print(arg)def combined_example(pos_only, /, standard, *, kwd_only): # 將多個特性混合在一起print(pos_only, standard, kwd_only)
請一定一定要按官方示例代碼中的調(diào)用方法去運(yùn)行上述代碼的調(diào)用,以此來理解這些特性的使用方式和區(qū)別:
最后值得注意的一點(diǎn)的是**kwds
def foo(name, /, **kwds): return 'name' in kwdsfoo(1, **{'name': 2})# 我們這樣改寫一下代碼去理解def foo(name, /, **kwds): print(name) for i in kwds: # kwds是字典結(jié)構(gòu),它也可以像list一樣使用index獲取對應(yīng)位置的字符,只是和list有些差別 print(i, kwds[i])foo(1, **{'name': 2}, **{'long': 3})
{'name': 2}就是前面提到的字典(dict), name就是關(guān)鍵字,2就是它的值,然后用花括號括起來就是字典了。其中**kwds可以接收多個字典,而/符號表示只允許位置參數(shù)。字典同樣我們只是簡單了解一下,和前面的list一樣,會有專門的操作方法,我們后面再深入了解它。
Parameters following the "/" may be positional-or-keyword or keyword-only.
因?yàn)閚ame后面跟著/,所以此處表示name是接收位置參數(shù)。
官方還總結(jié)了這些參數(shù)的使用場景:
As guidance:
Use positional-only if you want the name of the parameters to not be available to the user. This is useful when parameter names have no real meaning, if you want to enforce the order of the arguments when the function is called or if you need to take some positional parameters and arbitrary keywords.
Use keyword-only when names have meaning and the function definition is more understandable by being explicit with names or you want to prevent users relying on the position of the argument being passed.
For an API, use positional-only to prevent breaking API changes if the parameter’s name is modified in the future.
如果你暫時完全理解不了也沒關(guān)系,只要記得位置參數(shù)和關(guān)鍵字的參數(shù)及用法就可以,后面寫腳本時,多寫幾遍腳本就完全理解了。
我們已經(jīng)認(rèn)識了List([1, 2, 3, 4])和dict({‘a(chǎn)':1, 'b':2}),兩種類型,最后一種我們要認(rèn)識的是元祖(tuple)。
a=(1,2)print(a)print(a[0])type(a)
這三種類型各有用處,目前我們無需了解。
剛剛我們講到**kwds會收集多個字典,*則會收集多個變量。被收集的變量最終會組合成元祖。
These arguments will be wrapped up in a tuple
官方的示例代碼可能不太好懂,因此,你可以試試下面的代碼:
def output(*args): for i in args: print(i)output('a', 'b', 1, 2, 3)
因此,你可以同時使用*args和**kwds去收集位置參數(shù)和字典參數(shù),但順序仍然要按照位置參數(shù)在前,字典參數(shù)在后的規(guī)則。后面我們會經(jīng)常用到這種語法,因此目前了解即可。
解構(gòu)參數(shù)列表,就是在函數(shù)執(zhí)行時傳參,可以使用*解構(gòu)列表(list)或元祖(tuple),**用來解構(gòu)字典(dict)。即在定義函數(shù)時,這兩個符號可以用來接收多個參數(shù),同樣我們在執(zhí)行該函數(shù)時,也可以使用這兩個符號,去將多個參數(shù)分解成單獨(dú)的參數(shù)傳給函數(shù)。只要理解了上述的相關(guān)內(nèi)容,那么你也很容易理解解構(gòu)的應(yīng)用。
4.8.6到4.8.8的內(nèi)容太過高級,很難讓大家完全理解,再加上這兩節(jié)已經(jīng)給大家介紹了太多的東西,都沒有完全弄懂。所以這部分內(nèi)容請大家先跳過,我們以后了解更多的東西后,再來理解這部分內(nèi)容吧。
本次教程要接近尾聲了,但末尾是最重要的東西:編碼風(fēng)格。這是一種大家都遵守的編碼規(guī)范,真正好的代碼寫出來應(yīng)該是賞心悅目的,同時又是簡潔高效且易于理解的。而故意使用晦澀難懂的方式書寫代碼的人,看起來高大上,其實(shí)實(shí)用性極差。大型項(xiàng)目是由眾多人員合力完成,而項(xiàng)目里存在大量晦澀難懂的代碼,這不利于大家通力合作。
當(dāng)然大家還沒有了解全部的語法,因此,這里大家只記住前6條即可。
本次教程結(jié)束,謝謝大家。
收銀機(jī)pos機(jī),庫存,錄入,都怎么弄,最好具體點(diǎn),使用說明?
你說這個就比較麻煩了,因?yàn)槟銢]有說是什么型號,由哪家公司生產(chǎn)的POS系統(tǒng)。
不過沒有關(guān)系,一般來說這種系統(tǒng)都是比較規(guī)范的公司編寫的,可以在幫助文件中查到這家公司的聯(lián)系方式,給他們?nèi)ル娫捯箅娫捈夹g(shù)支援服務(wù)。他們是很樂意解答的。當(dāng)然了,前提是這家公司還存在。以上就是關(guān)于pos機(jī)編程教程,python編程系列教程的知識,后面我們會繼續(xù)為大家整理關(guān)于pos機(jī)編程教程的知識,希望能夠幫助到大家!
