網上有很多關于pos機編程教程,python編程系列教程的知識,也有很多人為大家解答關于pos機編程教程的問題,今天pos機之家(www.mxllmx.com)為大家整理了關于這方面的知識,讓我們一起來看下吧!
本文目錄一覽:
1、pos機編程教程
2、收銀機pos機,庫存,錄入,都怎么弄,最好具體點,使用說明?
pos機編程教程
我們之前所有寫過的代碼,都比較固定,且目的單一,復用性差等等的缺點。那我們想要重復利用一段代碼,僅通過改變它的變量,就可以產生不同的結果,這樣可不可以呢?這就是函數所能做到的功能。
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) # 此處可以任意更改你想要的范圍
這段官方示例代碼,就是把我們之前寫的斐波那契數列加了一層函數,這下我們可以任意計算斐波那契數列了。
The keyword def introduces a function definition
所以,函數的關鍵字def就是definition的縮寫,后面跟著函數名字,并把該函數的參數用括號括起來,以冒號結果。函數主體要和這一句保持四個空格的縮進,也就是“must be indented”。
冒號以下的部分,稱之為body,body里的第一句話卻是用三個引號給包起來了。我們知道前面說過的字符串類型(str)的字符,是用單引號或雙引號引起來的,但在這里用三個引號引起來的是另外一種類型,是文檔類型的字符,(documentation string, docstring),用來說明本函數的作用 。這一部分是可選的,但是官方建議養(yǎng)成這個習慣,關于它的作用,我們后面很快提到。
so make a habit of it.
剩下的就是執(zhí)行的部分了(execution) ,這里就是我們最初開始寫的fib循環(huán)
a, b = 0, 1while a < n: # 這里的n是函數傳參過來的 print(a, end=' ') # print()默認是以\結束,\被被翻譯成newline,新起一行的意思。可以試試print('abc\def')會發(fā)生什么。 a, b = b, a+bprint() # 這里為什么要有一個空的print?請自行實驗去掉后會有什么情況發(fā)生
fib(2000)就是在調用這個函數,同時將2000這個參數傳入,while循環(huán)里的n會將這個參數代入進行計算,這就是這段代碼的含義了。如果你仔細閱讀過官方關于這段代碼的解釋,你會發(fā)現它提到一個local variables的相關概念,即變量又有本地和全局之分。這里的本地指的是函數內的變量,外面并不可以直接使用,比如看下面的例子:
a=1def b(n): c = n print(c)b(a)print(c)
c就是函數b的本地變量,它只能在函數內生效,而在函數外卻讀不到這個變量,而a在函數內外都可以讀到。關于函數的影響范圍,我們后面還會提到。當前只是讓大家熟悉編程,如果每一個細節(jié)都精講,對大家來說是負擔。而在熟悉編程之后,這些細節(jié)卻又可以提升你的編程能力。所以不要急,我們目前僅需要知道“億點點”知識,可以讓代碼跑起來,大致理解這段代碼的含義即可。
函數執(zhí)行是帶括號執(zhí)行,而不帶括號只運行函數的名字,就會返回一串神秘代碼
這就相當于一個碗是用來盛飯的,而你只在那里大叫“碗!碗!碗!”,它根本什么作用都沒有發(fā)揮,而只有你端起碗盛飯,這里它才起了作用。所以當你不帶括號運行函數時,什么作用都不會發(fā)揮,它只會返回這個函數所在的“地址”,這個“地址”是什么東西,同樣請你暫時忽略,后面會講到。
編程需要了解操作系統原理,所以當碰到相關概念時,我們不得不暫時跳過。熟悉編程后,有些東西稍微一提,你當即就會舉一反三,很快理解。不過想全面了解操作系統原理,還是需要查閱相關書籍的。但是一定一定要動手,本教程及官方文檔的示例代碼,請一定要手動跟著敲打出來,這已經是非常簡單的代碼了。
函數都是會返回一個值的,即使你沒有寫出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,它默認“幫”你寫了return并反回"None"這個值,而其它編程語言如果不寫return語句,可能會直接提示語法錯誤。所以官方的下一段代碼便讓fib用return返回值,此時你再使用pint(fib2(100))時,卻不返回None了。
另外值得一提的是result.append(a)這一段代碼,result是個列表,前面我們只是簡單了解了它,和字符串str有些類似。這里的append是在向列表追加內容。我們知道無論是str, num還是list,function等等我們所有見過的各種類型,在python里都叫object,這些object都有某些方式去操作它,這些方式叫作method,而append就是list的操作方式之一,以后我們會碰到很多,先這樣理解。
函數的使用是非常靈活的,因此在定義函數時,有很多用法。
函數定義時給予默認值,這個官方示例代碼結合了循環(huán)、判斷和函數定義。
def ask_ok(prompt, retries=4, reminder='Please try again!'): # prompt, retries和reminder都是參數 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)
嘗試下面的每一個函數調用
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!')
運行過上面的代碼,如果你在其中故意亂輸入一些字符,它會提示你'Please try again!',直到某次之后它直接退出,然后報錯'invalid user response'。你會發(fā)現定義函數時括號內的prompt, retries等變量會和你調用函數時的括號里傳進去的參數順序保持一致。你的傳參會改變函數運行時的動作,這樣一來,函數的使用范圍更廣了。即使你有不同的使用目的,只要函數設計得恰當,你都可以拿來使用,復用率非常高,還省事兒。
上面的示例代碼,也不難理解,都是你見過的東西,唯一兩個不同的是in和raise這兩個關鍵字(keyword)。
in是判斷一個序列(sequence)里,有沒有一個特定的值,比如ABC里有沒有D?比如123里有沒有2等等。
另外一個是raise, 會主動拋出指定的錯誤類型然后停止腳本的執(zhí)行。不過我們目前對python中的錯誤類型并不熟悉,你只需要知道raise的作用就可以,以后我們會單獨講一下它。
這樣你就可以自行理解以上的代碼了,如果還是不理解,多運行一下那三句調用函數的代碼,然后結合之前的內容,理解這段代碼。
還要注意的是變量和函數之間的影響,就比如官方在這兩段代碼中展示的變量和函數的影響范圍:
i = 5def f(arg=i): # 這里的函數傳參使用了已經定義過了的變量 print(arg)i = 6 # 改變函數定義時使用的變量f() # 輸出結果只使用函數定義那一刻的變量值,后續(xù)被引用的變量值改變,也不會影響函數已經使用了的變量。
def f(a, L=[]): L.append(a) return Lprint(f(1)) # 函數里定義了L這個列表,雖然在外面看不到,但重復調用這個函數,該列表卻發(fā)生了改變。print(f(2))print(f(3))
為什么會這樣,為什么第一個函數的參數i不會改變,而第二個函數的參數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.
官方在這里著重解釋了,當函數使用可變的對象(object)作用默認值時,和不可用對象作為默認值有顯著區(qū)別,如何去理解?
i = 5def f(arg=i): # 這里的i會使用i的值,是5,而5是個具體的值,不可改變。def f(a, L=[]): # 這里的L定義了一個列表,但是列表是可變的,所以在運行該函數時,輸出內容總是互相影響。
如何避免這種互相影響的局面呢?官方也已給出了答案。
def f(a, L=None): if L is None: L = [] # 每次運行函數時,L都會被重置為一個空的列表,這樣就不會影響下次調用的結果了。 L.append(a) return L
理解了上面的默認值,那么也可以理解關鍵字(Keyword Arguments)的函數定義與調用。關鍵字即一對key和value組成的,這種類型的對象可以直接指定參數的關系,這種關系叫作字典(dict)。比如”張三=男“和 ”李蕊=女“,就可以直接得到兩個姓名以及他們對應的性別,而不用再使用其它變量單獨定義性別。它與上在的默認值的區(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, "!")
帶有關鍵字的函數調用方法:
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
最重要的一點是,位置參數(如valtage),一定要在關鍵字參數(如state='a stiff')之前,而關鍵字參數的順序就可以隨意打亂了,如上面的例子。
下面的官方示例代碼很詳細地解釋了,(位置)參數,關鍵字參數,只包含位置參數和只包含關鍵字參數的用法:
def standard_arg(arg): # 普通參數,即位置參數print(arg)def pos_only_arg(arg, /): # 只允許位置參數print(arg)def kwd_only_arg(*, arg): # 只允許關鍵字參數print(arg)def combined_example(pos_only, /, standard, *, kwd_only): # 將多個特性混合在一起print(pos_only, standard, kwd_only)
請一定一定要按官方示例代碼中的調用方法去運行上述代碼的調用,以此來理解這些特性的使用方式和區(qū)別:
最后值得注意的一點的是**kwds
def foo(name, /, **kwds): return 'name' in kwdsfoo(1, **{'name': 2})# 我們這樣改寫一下代碼去理解def foo(name, /, **kwds): print(name) for i in kwds: # kwds是字典結構,它也可以像list一樣使用index獲取對應位置的字符,只是和list有些差別 print(i, kwds[i])foo(1, **{'name': 2}, **{'long': 3})
{'name': 2}就是前面提到的字典(dict), name就是關鍵字,2就是它的值,然后用花括號括起來就是字典了。其中**kwds可以接收多個字典,而/符號表示只允許位置參數。字典同樣我們只是簡單了解一下,和前面的list一樣,會有專門的操作方法,我們后面再深入了解它。
Parameters following the "/" may be positional-or-keyword or keyword-only.
因為name后面跟著/,所以此處表示name是接收位置參數。
官方還總結了這些參數的使用場景:
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.
如果你暫時完全理解不了也沒關系,只要記得位置參數和關鍵字的參數及用法就可以,后面寫腳本時,多寫幾遍腳本就完全理解了。
我們已經認識了List([1, 2, 3, 4])和dict({‘a':1, 'b':2}),兩種類型,最后一種我們要認識的是元祖(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去收集位置參數和字典參數,但順序仍然要按照位置參數在前,字典參數在后的規(guī)則。后面我們會經常用到這種語法,因此目前了解即可。
解構參數列表,就是在函數執(zhí)行時傳參,可以使用*解構列表(list)或元祖(tuple),**用來解構字典(dict)。即在定義函數時,這兩個符號可以用來接收多個參數,同樣我們在執(zhí)行該函數時,也可以使用這兩個符號,去將多個參數分解成單獨的參數傳給函數。只要理解了上述的相關內容,那么你也很容易理解解構的應用。
4.8.6到4.8.8的內容太過高級,很難讓大家完全理解,再加上這兩節(jié)已經給大家介紹了太多的東西,都沒有完全弄懂。所以這部分內容請大家先跳過,我們以后了解更多的東西后,再來理解這部分內容吧。
本次教程要接近尾聲了,但末尾是最重要的東西:編碼風格。這是一種大家都遵守的編碼規(guī)范,真正好的代碼寫出來應該是賞心悅目的,同時又是簡潔高效且易于理解的。而故意使用晦澀難懂的方式書寫代碼的人,看起來高大上,其實實用性極差。大型項目是由眾多人員合力完成,而項目里存在大量晦澀難懂的代碼,這不利于大家通力合作。
當然大家還沒有了解全部的語法,因此,這里大家只記住前6條即可。
本次教程結束,謝謝大家。
收銀機pos機,庫存,錄入,都怎么弄,最好具體點,使用說明?
你說這個就比較麻煩了,因為你沒有說是什么型號,由哪家公司生產的POS系統。
不過沒有關系,一般來說這種系統都是比較規(guī)范的公司編寫的,可以在幫助文件中查到這家公司的聯系方式,給他們去電話要求電話技術支援服務。他們是很樂意解答的。當然了,前提是這家公司還存在。以上就是關于pos機編程教程,python編程系列教程的知識,后面我們會繼續(xù)為大家整理關于pos機編程教程的知識,希望能夠幫助到大家!
