python乾貨:在數據交換值時不推薦使用中間變量,那我們怎麼辦?

2020-12-16 科技叮鈴噹啷

上一篇文章:怎麼從細節中提高python代碼質量?今天我們來聊聊中間變量。

我們提到,在數據交換值的時候,不推薦使用中間變量,那怎麼來交換兩個變量的值呢?

在我們編碼初期我們是這麼解決的:定義一個新的變量,利用它來完成交換。

初期我們可以這麼去做,因為這樣非常好理解,但是它的缺點也很明顯,因為使用了臨時變量,這樣實在浪費資源

那麼有沒有辦法不利用這個「第三者」呢,答案是必須的!

接下來我給大家通過四種方法(算法)來實現。

算術運算;指針地址操作;位運算;棧實現。1.算術運算,代碼如下:

原理:把m、n看作數軸上的點,圍繞兩點間的距離來進行計算。

2.指針地址操作,代碼如下:

原理:對地址的操作實際上進行的是整數運算

理論上我們是通過運用算術算法類似的運算來實現地址的交換,從而達到交換變量的目的。即:

通過運算m、n的地址果然完成了交換,且m指向了原先n指向的值,n指向原先m指向的值了嗎?上面的代碼可以通過編譯,但是執行結果發生錯誤!怎麼回事啊?兄弟別急,先了解一個概念,作業系統把內存分為幾個區域

系統代碼/數據區、應用程式代碼/數據區、堆棧區、全局數據區等等。在編譯源程序時,常量、全局變量等都會被放入全局數據區,局部變量、動態變量則放入堆棧區。

這樣當算法執行到「m=(int*)(n-m)」時,m的值並不是0x00000200h,而是要加上變量m所在內存區的基地址,實際的結果就是:0x008f0200h,其中0x008f就是基地址,0200則是m在該內存區的位移。它是由編譯器自己自動添加的。因此導致以後的地址計算都不正確,使得m,n指向所在區的其他內存單元。再者,地址運算不能出現負數,即當m的地址大於n的地址時,n-m就會小於零,系統自動採用補碼的形式表示負的位移,由此會產生錯誤,導致與前面同樣的結果。

那怎麼辦呢,別急!以下是整改後的算法:

算法做的最大改進就是採用位運算中的與運算「int(m)&0x0000ffff",因為地址中高16位為段地址,後16位為位移地址,將它和0x0000ffff進行與運算後,段地址被屏蔽,只保留位移地址。這樣就原始算法吻合,從而得到正確的結果。

大家看著可能有點不好理解,但是他的好處是:即在交換很大的數據類型時,執行速度比算術算法快

3.位運算,代碼如下:

此算法能夠實現是由異或運算的特點決定的,通過異或運算能夠使數據中的某些位翻轉,其他位不變。這就意味著任意一個數與任意一個給定的值連續異或兩次,值不變。

4.棧實現,代碼如下:

以上算法均實現了不藉助其他變量來完成兩個變量值的交換,相比較而言算術算法和位算法計算量相當,地址算法中計算較複雜,卻可以很輕鬆地實現大類型(比如自定義的類或結構)的交換。

而從實際的軟體開發看,標準算法無疑是最好的,能夠解決任意類型的交換問題。

相關焦點

  • 怎麼從細節中提高python代碼質量?今天我們來聊聊中間變量
    今天我們聊的知識點是:為什麼在數據交換值的時候,不推薦使用中間變量交換兩個變量的值,大家熟悉的代碼如下:交換兩個變量的值上面的實現方式不需要藉助任何中間變量,並且能夠獲取更好的性能我們來簡單測試一下。性能測試從測試結果可以看出,第二種方式耗費的時間更少,並且由於不需要藉助中間變量,代碼更為簡潔,是值得推薦的一種方式。那麼為什麼第二種方式可以做到更優呢?
  • python教程之python數學運算
    存儲數據變量#兩個變量交換值,通過第三個參數實現print('兩個變量交換值,通過第三個參數實現'); #第一種方法是通過第三個參數實現x=5;#變量賦值y=11; #變量賦值print('交換前',x,y);temp=x;x=y;y=temp;print('交換後',x,y);#兩個變量交換值,更便捷的方法print('兩個變量交換值
  • 二、Python基礎數據類型、變量、常量
    二、Python基礎數據類型、變量、常量1.變量:把程序運行的中間結果臨時的存在內存中,以便後續的代碼調用變量不僅可以是數組,還可以是任意數據類型。在程序中,變量就是用一個變量名表示,變量名必須是大小寫英文、數字、和『_』下劃線組合,並且不能以數字開頭。
  • 我要悄悄學Python之變量與數據類型
    變量和簡單的數據類型★在學習之前,需要各位小夥伴具有百度的搜索能力。本系列分享的每一章都是核心知識。在編程的過程當中遇到的問題可以自己百度可以解決的一定要自己解決,實在是不會再問問題。」在本篇文章當中,你將學會Python中使用的各種數據,還將學習如何在程序中使用變量來表示這些數據。
  • python進階教程之變量
    變量的引用1.1 引用的概念在 Python中注意:如果變量已經被定義,當給一個變量賦值的時候,本質上是 修改了數據的引用變量 不再 對之前的數據引用變量 改為 對新賦值的數據引用1.2 變量引用 的示例在 Python中,
  • Python如何定義變量,不可變數據,數字、字符串、元組詳解
    不可變數據就是變量一旦初始化就不能修改Python的六個標準數據類型中不可變數據(3 個):Number(數字)、String(字符串)、Tuple(元組)。內置的 type() 函數可以用來查詢變量所指的對象類型。
  • Python教程基礎語法、變量基本使用和算術運算符
    變量的基本使用程序就是用來處理數據的,而變量就是用來存儲數據的目標· 變量定義· 變量的類型· 變量的命名= "123"輸出 qq_password 中保存的內容In [4]: qq_password Out[4]: '123' ```使用交互式方式,如果要查看變量內容,直接輸入變量名即可,不需要使用 print 函數2) 變量演練 2 ——
  • 初學者使用Python的一些基礎知識(了解變量,集合,循環等信息)
    既然我們知道如何聲明變量並為其分配值,那麼下一步就是探索不同的變量類型。Int,Float,String,和Boolean 是基本數據類型的Python支持。看一下如何聲明和給它們賦值:Python中的基本數據類型多虧了Python的簡單語法,我們可以使用不同的數據類型在一個變量中聲明多個變量:基本操作現在我們學習了如何創建變量,現在該探討基本功能了-查找字符串的長度,將字符串轉換為大寫或小寫
  • 完美契合人類習慣的Python變量和基本數據類型
    做科學計算和數據分析,變量是始終繞不開的話題。學習程序設計語言,理解了變量相當於掌握了一半。不過,不同程式語言對變量的定義、使用和釋放區別很大。Python中的變量到底是什麼,該怎麼樣掌握變量?從我接觸的語言中,Python和Matlab幾乎是最簡單的,特別容易掌握。
  • Python 基本數據類型和變量
    字符串英文 string ,是 python 中隨處可見的數據類型,字符串的識別也非常的簡單,就是用「引號」括起來的。而我們上面對整數的定義是什麼?是沒有小數點的數字。因此int4肯定不是整數。這裡我們可以使用type()函數來查看下類型。
  • Python專題 | (三)注釋、變量與輸出
    在編程前期,寫下變量、函數(之後會講到)和自己掌握不太清晰的語句的注釋就可以了。python注釋的寫法有很多種,我們分為兩種情況介紹:單行注釋一般使用「#」號開頭,表示注釋開始,#號之後的都是注釋,在這裡寫的所有語句均不會被計算機識別和執行。#號的作用範圍僅為當前行,想要將注釋寫到下一行時,可以在前面繼續添加#號。
  • 菜鳥學Python雜談1: 3分鐘學Python變量和數據類型
    閱讀本文大概需要3分鐘:任何一門語言比如C++,Java,Perl,Python語法上的招式主要包含變量類型,數據結構,循環控制,
  • python基礎知識變量、運算和數據類型
    昨天搭建好juypter notebook,並錄製了第一堂python的課程,簡單講解了python的歷史,以及python可以幫助我們如何提供效率。知識點2:變量與賦值(什麼是什麼)第一種方法與後兩種方法的區別:前者只是把Python當做簡單的計算器使用;後者有編程思想,通過變量賦值使得計算今日收益率這一過程的程式語言的含義更加明了,更易於閱讀和理解。通過變量賦值,如何將「今日收盤價是22.5」這句話轉換為 Python 語言?
  • 【技巧總結】Python 使用和高性能技巧完結
    避免數據複製# 不推薦寫法,代碼耗時:6.5秒def main(): size = 10000 for _ in range(size): value = range(size) value_list = [x for x in value] square_list = [x * x for x in value_list]上面的代碼中
  • python中使用else代替狀態變量
    翻看公司的代碼文檔,在代碼風格文檔中,寫著:為了提高代碼的可維護性,代碼中減少flag這類狀態變量的使用。
  • Python變量,輸入和輸出,數字,字符串操作
    一、變量以及類型在Python中,存儲數據,就需要使用到一個叫做變量的東西。例如:age = 10name = 『Python』簡而言之,變量就是用來存儲數據用的。變量是由多種類型的,具體如下圖:既然變量有那麼多,我們怎麼確定一個變量的類型呢,這裡就需要使用type函數了,這個函數會返回變量的類型的。
  • 8年 Python 的我,總結了這 90 條寫 Python 程序的建議
    都有去看Google的Python代碼規範,對這幾年的工作經驗,做個簡單的筆記,如果你也在學pythpn,準備要學習python,希望這篇文章對你有用。1. 首先 建議1、理解Pythonic概念—-詳見Python中的《Python之禪》(1)避免不規範代碼,比如只用大小寫區分變量、使用容易混淆的變量名、害怕過長變量名等。有時候長的變量名會使代碼更加具有可讀性。
  • Python基礎:數據類型和變量&字符串和編碼
    如果'本身也是一個字符,那就可以用""括起來,比如"I'm OK"包含的字符是I,',m,空格,O,K這6個字符。如果字符串內部既包含'又包含"怎麼辦?可以用轉義字符\來標識,比如:'I\'m \"OK\"!'表示的字符串內容是:I'm "OK"!
  • 詳解python 局部變量與全局變量
    一旦本文將詳細分析python的全局變量與局部變量,學過php的人都知道,php裡面的全局變量是無法在function裡面去使用的,只有超全局變量才可以
  • Linux下初學python之變量類型
    前言前面三篇文章我們和大家一起系統的學習了python的基本語法,包括:注釋、空行、列印、多行連字符等。今天我和大家一起學習python裡面的變量類型。python的變量類型1.變量的聲明和賦值在python中,變量是不需要聲明類型的。